【问题标题】:Using dynamically created controls in C#在 C# 中使用动态创建的控件
【发布时间】:2011-01-12 04:56:39
【问题描述】:

我正在创建一个应用程序,用户将在其中输入成绩,程序将输出加权平均值。加载时,它会询问作业的类别数。然后程序将动态创建文本框供用户输入信息。问题是我不知道如何阅读创建文本框后输入的文本。这是我的代码:

            TextBox txtbx = new TextBox();
            txtbx.Text = "";
            txtbx.Name = "txtbx1";
            txtbx.Location = new Point(10, 10);
            txtbx.Height = 20;
            txtbx.Width = 50;
            Controls.Add(txtbx);

如何更改此代码,以便在用户提交时在框中找到当前文本?

【问题讨论】:

    标签: c# controls


    【解决方案1】:

    如果您正在动态生成控件,那么显然您将无法为每个控件设置一个字段。但是,如果您尝试访问命名控件的 Controls 集合,则可以按名称对 ControlCollection 进行索引。添加具有指定名称的文本框后,您可以简单地这样做:

    TextBox txtbx = (TextBox)Controls["txtbx1"];
    

    【讨论】:

      【解决方案2】:

      您可以使用Page 类的FindControl 方法。

      这个方法有一个参数是TextBox的ID,你必须在创建时设置它:

      txtbx.ID = "txtbx1";
      

      然后就可以选择了:

      TextBox txtbx1 = (TextBox)FindControl("txtbx1");
      

      并使用它。


      编辑:由于最初的问题补充说他指的是 Windows 窗体,所以我上面的回复是题外话。

      在 Windows 窗体中,您应该简单地使用类成员变量而不是局部变量。例如:

      public partial class MyForm
      {
          ...
      
          private TextBox txtbx;
      
          ...
      
          private void createControls()
          {
              txtbx = new TextBox();
              txtbx.Text = "";
              txtbx.Name = "txtbx1";
              txtbx.Location = new Point(10, 10);
              txtbx.Height = 20;
              txtbx.Width = 50;
              Controls.Add(txtbx);
          }
      
          private void someOtherFunction()
          {
              // Do something other with the created text box.
              txtbx.Text = "abc";
          }
      }
      

      【讨论】:

      • 我似乎找不到 Page 类,它只适用于 asp.net 吗?我正在制作一个 Windows 应用程序。
      【解决方案3】:

      此代码用于在按钮单击时动态添加文本框

      int count = 1;
      public System.Windows.Forms.TextBox AddNewTextBox()
          {
              System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
              this.Controls.Add(txt);
              txt.Top = count * 25;
              txt.Left = 100;
              txt.Text = "TextBox " + this.count.ToString();
              count = count + 1;
              return txt;
          }
      private void Onbutton_Click(object sender, EventArgs e)
          {
            //Call the method AddNewTextBox that uses for Dynamically create Textbox
              AddNewTextBox();
          }
      

      我希望这段代码对你有所帮助。 谢谢你 快乐编码:)

      【讨论】:

        【解决方案4】:

        保留表单上所有文本框的引用列表。动态创建时将 textBox 引用添加到列表中。

        然后,当您想要阅读其文本时,您可以简单地遍历列表中的所有文本框。

        确保根据相关类别名称命名文本框。然后你也可以通过名字在列表中找到控件。

        class MyForm : Form
        {
            IList<TextBox> _textBoxes = new List<TextBox>();
        
            private void AddTextBox(string categoryName){
        
                var myTextBox = new TextBox();
                myTextBox .Name = categoryName + "txtbx";
        
                // set other properties and add to Form.Controls collection
        
                _textBoxes.Add(myTextBox);
            }
        
            private TextBox FindTextBox(string categoryName)
            {
                return _textBoxes.Where( t => t.Name.StartsWith(categoryName)).FirstOrDefault();
            }
        }
        

        【讨论】:

          【解决方案5】:

          您需要做的就是为您的提交按钮设置一个 OnClick 侦听器并让它执行类似的操作

          private void OnSubmit(object sender, EventArgs args)
          {
              string yourText = txtbx.Text;
          }
          

          创建文本框后,您必须保留对文本框的引用。 yourText 将包含您需要的值。希望这会有所帮助

          【讨论】:

          • 如何创建对文本框的引用?
          • 您可以在函数范围之外将“txtbx”声明到“OnSubmit”函数可以看到的位置,或者正如 Uwe Keim 提到的,您可以使用 FindControl 并将其设置为("txtbx1")。
          猜你喜欢
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 2017-07-22
          • 1970-01-01
          • 2023-03-28
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多