维护控制箱的最佳方法是什么?

时间:2016-05-13 06:26:55

标签: c# winforms

enter image description here

我在这里使用c#.net。

combobox1包含从1到无限制的数字,例如n,如果combobox1.text == 1,则显示textbox1textbox2combobx1.text == 2然后{{ 1}}到textbox1textbox4然后combobox1.text==ntextbox1出现。

如何设置要动态添加的textbox2*n个对象?我的combobox1中的项目限制为8,这意味着我只有16个文本框。如果我想文本框的数量是n,则无限制。 例如在控制台中。

textbox

类似的东西,但在Windows窗体中。 我正在学习制作回归插值程序,所以我需要x和y。这就是为什么如果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()); } 那么2个文本框应该可见

谢谢

6 个答案:

答案 0 :(得分:2)

像这样:

1

答案 1 :(得分:0)

我的看法如下:

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

一个块全部,​​一个Tag来维持每个控件。

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

对于更复杂的操作,包括动态更改需求,您仍然可以创建List<Control>并循环它们。

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

为了避免阻止,您仍然可以将所有参与的控件添加到List<Control>并循环显示:

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 "));
}

答案 2 :(得分:0)

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

您还希望将它们放在带有垂直滚动条的面板中,而不是将它们放在表单上,​​这样您就不会用完空间。

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

答案 3 :(得分:0)

您可以添加这样的枚举

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;
}

答案 4 :(得分:-1)

为要显示的控件的标记赋值(为组合为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();

答案 5 :(得分:-1)

您还可以将容器内的控件分组,并将容器可见性初始化为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;

        }
    }

这与您已有的类似,但您可以将多个控件组合在容器内并一次显示所有控件。