【问题标题】:How to transfer the text from dynamically generated user control to a textbox如何将文本从动态生成的用户控件传输到文本框
【发布时间】:2012-12-19 05:28:07
【问题描述】:

我有一个 Windows 窗体,其中有一个 button1,当单击它时,动态添加到代码中的 UserControl 是这样的:

    int c = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        int v;
        v = c++;
        panel1.VerticalScroll.Value = VerticalScroll.Minimum;
        UserControl1 us = new UserControl1();
        us.Name = "us" + v;
        us.Location = new Point(50, 5 + (30 * v));
        us.Tag = btn;
        panel1.Controls.Add(us);
     }

UserControl 包含 4 个控件、2 个组合框和 2 个文本框

combobox1combobox2textbox1textbox2

有 4 个文本框在同一个表单上

still-textbox1still-textbox2still-textbox3still-textbox4

button2,它会将文本传输到组合框和文本框oldcombobox1oldcombobox2oldtextbox1oldtextbox2

button1 被点击两次时,它会在表单中添加两个UserControls。 我想以以下格式传输文本

oldcombobox1.text = still-textbox1.text + "," + combobox1.text(which is dynamically generated) + "," + combobox1.text (which is dynamically generated) 等来自 UserControl 的所有 combobox1 文本(动态添加)

oldcombobox2.text = still-textbox2.text + "," + combobox2.text (which is dynamically generated) + "," + combobox2.text (which is dynamically generated) 等来自 UserControl 的所有 combobox2 文本(动态添加)

oldtextbox1.text = still-textbox3 + "," + textboox1.text (which is dynamically generated) + "," + textbox1.text (which is dynamically generated) 等来自UserControl 的所有textbox1 文本(动态添加)

表示still-textbox1.text = first 当动态 UserControl 添加 3 次时,它将包含 3 次 combobox1 然后 oldcombobox1 应包含:

firstcombobox1.textcombobox1.textcombobox1.text

我已经编写了这段代码,但它不起作用

  foreach (Control ctrl in panel1.Controls)
   {
     if (ctrl is UserControl)
     {
         UserControl1 myCrl = ctrl as UserControl1;
         oldcombobox1.text = still-textbox1.text + "," + myCrl.comboBox1.Text;
         oldcombobox2.Text =still-textbox2.text + "," + myCrl.comboBox2.Text;
         oldtextbox1.Text = still-textbox3.text + "," + myCrl.textBox1.Text;
         oldtextbox2.Text.Text = still-textbox4.text + "," + myCrl.textBox2.Text;
      }
    }

【问题讨论】:

  • 在您的 UserControl1 类中创建公共字符串属性,使您可以访问控件中所需的字符串。
  • 秘银?什么 ?我没有理解你能写和理解代码吗?那我就知道你想说什么了
  • @shariq_khan 我认为 Mithrandir 的回答回答了你。
  • @shariq_khan 几件事。 1)告诉我你现在得到什么输出。 2)什么是still -?这怎么可能写? 3)您能否发布您的应用程序的两个屏幕截图,一个是您的应用程序(包括所有用户控件、按钮等),另一个是单击按钮后所需输出的两个屏幕截图? 4)你的“动态添加的组合框”是什么?我看到只有一个用户控件是从您的代码中动态添加的。
  • @shariq_khan:您应该在命名约定上工作的一个建议

标签: c#


【解决方案1】:

您可以创建一个类级别的变量:

    private UserControl1 us1;
    private UserControl1 us2;

    private void button1_Click(object sender, EventArgs e)
    {
        int v;
        v = c++;
        panel1.VerticalScroll.Value = VerticalScroll.Minimum;

        if(us == null) 
        {
            //this is the first time the control is created
            us1 = new UserControl1();
            us1.Name = "us" + v;
            us1.Location = new Point(50, 5 + (30 * v));
            us1.Tag = btn;        
            panel1.Controls.Add(us1);
        }
        else if(us2 ==null)
        {
            us2 = new UserControl1();
            //whatever code you want to execute to change second one
            //you can access first control as us1.xxx
            panel1.Controls.Add(us2);

        }
        else
        {
           //3rd 4th etc...
        }


     }

【讨论】:

  • 你写的内容你看懂了吗
  • @shariq_khan 对不起,我误解了问题并更改了答案以添加第二个控件
【解决方案2】:

你应该为你想要从另一个对象访问的每个字符串添加类似这样的内容UserControl1(伟大的名字顺便说一句;-)),在这种情况下是textBox1的字符串:

public String FirstTextBoxText 
{
   get { return this.textBox1.Text; }
}

然后你可以在你的 Form 类中说:

 if (ctrl is UserControl)
 {
     UserControl1 myCrl = ctrl as UserControl1;
     // ...
     oldtextbox1.Text = still-textbox3.text + "," + myCrl.FirstTextBoxText;
 }

这仍然是可怕的代码,但它会工作。

【讨论】:

  • 先生,但是当按钮被点击四次时呢?这段代码会返回这种模式吗?仍然-textbox3.text,textbox3.text,textbox3.text,textbox3.text,textbox3.text???老,第一,第二,第三,第四?
  • @shariq_khan:至少对我来说,很难掌握你想要做什么。我试图回答您的问题,如何“将文本从动态生成的用户控件传输到文本框”。您需要做什么才能以符合您要求的方式处理文本,老实说,我不能说。
  • 我想要所有用逗号动态生成的第一个组合框,一开始它应该是 still-textbox3.text 你可以吗?请先生,我很麻烦,我已经尝试了很多,但无法摆脱这样的问题,我的整个项目都完成了(很简单),但这造成了问题对不起先生......但是你能做这个字符串生成器吗???跨度>
  • @shariq_khan:这个论坛是为了回答技术问题,而不是修复你的项目。即使有时间和意愿,以及您提供的信息,这也很难做到。
  • 先生,这只是技术问题......这里的所有人都问他们将在某些或其他项目中实施的问题..我也在这里寻求帮助......
【解决方案3】:

我会用事件来做这个。

创建一个继承自 EventArgs 的类: (我更喜欢VB,你可以翻译)

Public Class ControlEventArgs
  Inherits EventArgs

  Public Property Value1 As String = String.Empty
  Public Property Value2 As String = String.Empty
  Public Property Value3 As String = String.Empty
  Public Property Value4 As String = String.Empty

End Class

然后在你的控件中添加事件:

Public Event ValueSubmittal As EventHandler(Of ControlEventArgs)

在您的 Button2_Click 处理程序中:

RaiseEvent ValueSubmittal(me, new ControlEventArgs With {.Value1=comboBox1.Text, .Value2 = comboBox2.Text, .Value3 = textBox1.Text, .Value4 = textBox2.Text}

在您动态创建控件的表单中,您需要连接事件处理程序:

AddHandler myNewControl.ValueSubmittal, AddressOf ValueSubmittalHandler

还有ValueSubmittalHandler:

Private Sub ValueSubmittalHandler(sender as Object, e As ControlEventArgs)
  formControl1.Text = e.Value1
  formControl2.Text = e.Value2
  '  etc...
End Sub

【讨论】:

  • 如答案中所述..您可以翻译。
  • 我是 c# 新手,我对 vb 一无所知。. 只是听说过这个对不起
  • 我没有时间或意愿为您翻译此内容。有很多在线翻译服务。或者您可以在论坛中询问。
猜你喜欢
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多