【问题标题】:What is the best way to maintain control box?维护控制箱的最佳方法是什么?
【发布时间】:2016-05-13 06:26:55
【问题描述】:

我在这里使用 c#.net。

combobox1 包含一个从 1 到无限的数字,例如 n,如果出现 combobox1.text == 1,则出现 textbox1textbox2combobx1.text == 2 然后出现 textbox1textbox4combobox1.text==n然后出现textbox1textbox2*n

如何将textbox 对象设置为动态添加?我的组合框 1 中的项目限制为 8 个,这意味着我只有 16 个文本框。如果我想要文本框的数量不受 n 的限制怎么办。 例如在控制台中。

console.read("Input n : ");
int n = convert.toint16(console.readline());//100
double[] x = new double[n];
double[] y= new double[y];
for(int i = 0;i<n;i++){
x[i]=convert.todouble(console.readline());
y[i]=convert.todouble(console.readline());
}

类似的东西,但在 Windows 形式。 我正在学习制作回归插值程序,所以我需要 x 和 y。这就是为什么如果 combobox1.text==1 那么 2 个文本框应该是可见的

谢谢

【问题讨论】:

标签: c# winforms


【解决方案1】:

像这样:

var choice = int.Parse(comboBox1.Text);

// show 2 textboxes per value, so 10 should be max for 20textboxes
if (!Enumerable.Range(1, 10).Contains(choice))
    throw new ArgumentOutOfRangeException("only 1 to 10 is allowed : " + comboBox1.Text);

var textBoxes = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11, textBox12, textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, textBox19, textBox20 };
for (int i = 0; i < textBoxes.Length; i++)
    textBoxes[i].Visible = i < choice * 2;

【讨论】:

  • wow.thankyou!它可以工作,但是抛出异常是错误的,所以我命令如果。其余的都很好。谢谢!
  • 其实你应该保留它,但是在Enumerable之前添加一个!
  • 对不起,那个 throw 异常有什么用?我把范围改为 2,8,然后我在列中添加了“10”,然后我的程序显示错误。异常没有工作.
  • Nvm,你可以删除它,没有可能遇到IndexOutOfrangeException
【解决方案2】:

如果您不打算限制可以添加的文本框的数量,您应该通过根据需要动态创建新文本框来处理组合框的选定索引更改事件,设置它们的位置(左和顶部),并将它们添加到表单的控件属性中。您还可以通过实际从表单中删除文本框并处理它们来处理删除文本框,而不是使它们不可见。

您还需要将它们放在带有垂直滚动条的面板中,而不是将它们放在表单上,​​以免空间不足。

您可以使用 List 类的数组或实例来跟踪您的文本框。

【讨论】:

    【解决方案3】:

    我的看法是这样的:

    • 给每个参与的控件一个Tag,其中包含所有允许的值“1 3 4 5”等。注意空格!
    • 像这样设置每个的可见性:yourControl.Visible = yourControl.Tag.ToString.Contains(value.ToString(" #0 "));

    一个块和一个Tag 来维护每个控件。

    注意每个Tag可以包含多个值,每个值可以是多个Tags的一部分!

    对于更复杂的操作,包括动态更改需求,您仍然可以创建 List&lt;Control&gt; 并循环它们..

    请注意,虽然您的问题暗示了所选值与文本框之间的某种上升关系,但我没有使用它,因为它是偶然且易变的。相反,我将关注点分开并将可见性组存储在每个控件的标签中。这是可见的,易于维护,并且检查起来仍然非常快速。

    为避免阻塞,您仍然可以将所有参与的控件添加到 List&lt;Control&gt; 并循环它:

    List<Control> allBoxes = null ; 
    
    public Form1()
    {
      InitializeComponent();
      allBoxes = new List<Control>() { textBox1, textBox2, label1..};
      foreach (Control ctl in allBoxes) ctl.Tag = "";  // initialize..
    
      textBox1.Tag =  " 1 2 3 4 5 6 8 9 10 "
      textBox2.Tag =  " 3 4 5 6 8 9 10 "
      textBox3.Tag =  " 5 6 8 9 10 "
    
      textBoxXYZ.Tag =  " 1  3 7 5 10 "
    

    }

    void SetVisibility(int value)
    {
         foreach (Control ctl in allBoxes) 
           ctl.Visible = ctl.Tag.ToString().Contains(value.ToString(" #0 "));
    }
    

    【讨论】:

    • 好吧,我对这个控件还是新手,因为我刚刚学习了 OOP 和 windows 窗体。所以所有的文本框都存储在一个控件列表中?
    • 不在我的回答中。如果您需要获得更多控制权,您可以这样做,但对于原始问题,您不需要这样做。另外:如果将它们添加到 List 或 List 您只需存储引用以便在循环中轻松访问;类似于 aray 但更好用。控件仍将位于表单上。假设您在某个时候想要清除所有文本框。然后将所有内容都包含在List&lt;TextBox&gt; allBoxes 中,这很容易:foreach (TextBox tb in allBoxes) tb.Clear();
    【解决方案4】:

    你可以像这样添加一个枚举

    public enum  StyleVisibleOfControls{Style1,Style2,Style3}
    

    并像这样使用

    public StyleVisibleOfControls Style
    { 
        set{
            // you can use switch too
            if ( value ==StyleVisibleOfControls.Style1 )
            {
                label1.Visible = true;
                label2.Visible = true;
                textBox1.Visible = true;
                textBox2.Visible = true;
                textBox3.Visible = true;
                textBox4.Visible = true;
            }
            else if (value ==StyleVisibleOfControls.Style2){
                label1.Visible = true;
                label2.Visible = true;
                textBox1.Visible = true;
                textBox2.Visible = true;
                textBox3.Visible = true;
            }
        }
    }
    

    您也可以在扩展组合框中执行此操作

    if (comboBox1.Text == "2"){
       Style  = StyleVisibleOfControls.Style1;
    }
    else if (comboBox1.Text == "3"){
        Style  = StyleVisibleOfControls.Style2;
    }
    

    【讨论】:

      【解决方案5】:

      为您想要显示的控件的标记分配一个值(将 1 分配给当组合为 1 时应显示的那些控件等)和您的 combobox_selectedIndexChange:

      var val = int.Parse(comboBox1.SelectedItem.ToString());
      
      var cs = Controls.Cast<Control>().Where(c => c.Tag != null && int.Parse(c.Tag.ToString()) <= val).Select(c => { c.Visible = true; return c; }).ToList();
      

      【讨论】:

      • @TaW 为什么不呢?我错过了什么吗?
      • 每个 OP 标签需要包含多个值。可行,看我的答案.. –
      • @TaW 为什么标签需要多个值?组合值“2”显示 textbox2、3、4。组合值“3”显示 textbox2、3、4、5、6。因此,如果对 textbox2、3、4 使用标签“1”,对 textbox5 使用标签“2”, 6 然后从组合中选择值“1”将显示 textbox2、3、4。从组合中选择“2”将显示 textbox1、2、3、4、5、6。
      • 您假设值和可见性之间存在数学关系('
      【解决方案6】:

      您还可以将容器内的控件分组并将容器可见性初始化为 false:

      panel1.Visible = false;
      panel2.Visible = false;
      panel3.Visible = false;
      

      那么你可以这样做:

          private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
          {
              if (comboBox1.SelectedItem == "2")
              {
                  panel1.Visible = true;
              }
      
              if (comboBox1.SelectedItem == "3")
              {
                  panel1.Visible = true;
                  panel2.Visible = true;
              }
      
              if (comboBox1.SelectedItem == "4")
              {
                  panel1.Visible = true;
                  panel2.Visible = true;
                  panel3.Visible = true;
      
              }
          }
      

      这与您已有的类似,但您可以将多个控件分组到容器内并一次全部显示。

      【讨论】:

      • 不是很灵活,因为每个控件只能是一个组的一部分。
      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多