控件的对象列表

时间:2012-08-14 15:23:54

标签: c# visual-studio-2010

我正在尝试为多个对象创建某种类型的控件列表。该对象用于在屏幕上显示的图案,并具有若干不同的属性,例如持续时间,偏移,下一个图案,图案索引。我希望能够创建一个可迭代的控件列表,这样我就可以轻松地在GUI中设置每个模式的不同属性。这是我正在创建的形式的草稿。这是我正在创建的表单的链接。

enter image description here

每一行都是模式的属性集合。我希望能够以某种方式迭代代码中的每一行,并根据用户输入设置每个模式的属性。从我到目前为止所读到的,我想我想使用ItemsControl工具并以某种方式将其绑定到GUI,但我不确定如何做到这一点,或者这是我应该做的。我现在使用的是具有多个Panel的TableLayoutPanel,但似乎这些工具中没有太多控制权。我应该如何将每一行的控件组合在一起,然后有效地遍历每一行?

1 个答案:

答案 0 :(得分:0)

好吧我认为我已经实现了你的体育运动,我知道WPF比WinForms更好,但这是我的解决方案,我只是自己“自学成才”。

我将假设在您的解决方案中执行此操作不会有任何问题。

首先创建一个用户控件。我右键单击了我的WinForm项目>添加>用户控制。这是您要添加组成行的内容的地方。所以它看起来应该是这样的,我将我的用户控件命名为RowContent:

Control

确保您的名字是您的控件。因此,对于复选框,我将其命名为stprIndex_chkBox,enable_chkBox等。

现在,您需要为每个控件实现所需的功能。因此,您需要更改stprIndex_chkBox.Text的值以及enable_chkBox.Checked的初学者值。您还需要访问NumericalUpDowns的Value。所以在RowContent.cs中我根据表单中需要的数据添加了getter和setter。所以这里有一个访问者的片段(记住你会想要添加更多)

public partial class RowContent : UserControl
{
    public RowContent()
    {
        InitializeComponent();
    }

    public string SetChkBox1Text
    {
        set { stprIndex_chkBox.Text = value; }
    }

    public bool IsEnabledChecked
    {
        get { return enable_chkBox.Checked; }
    }
}

现在您看,这些将允许您访问RowContent类之外的变量。让我们转到TablePanelLayout控件。

我创建了一个额外的用户控件,就像我创建RowContent一样,但这次我把它命名为ContentCollection。我将用户控件的AutoSize设置为true,并将TableLayoutPanel(名为tableLayoutPanel1)放到其上。

为了节省时间,我将所有控件动态添加到行中:

public partial class ContentCollection : UserControl
{
    public ContentCollection()
    {
        InitializeComponent();
        RowContent one = new RowContent();
        RowContent two = new RowContent();
        RowContent three = new RowContent();
        RowContent four = new RowContent();
        RowContent five = new RowContent();
        RowContent six = new RowContent();
        tableLayoutPanel1.Controls.Add(one);
        tableLayoutPanel1.Controls.Add(two);
        tableLayoutPanel1.Controls.Add(three);
        tableLayoutPanel1.Controls.Add(four);
        tableLayoutPanel1.Controls.Add(five);
        tableLayoutPanel1.Controls.Add(six);
        tableLayoutPanel1.SetRow(one, 0);
        tableLayoutPanel1.SetRow(two, 1);
        tableLayoutPanel1.SetRow(three, 2);
        tableLayoutPanel1.SetRow(four, 3);
        tableLayoutPanel1.SetRow(five, 4);
        tableLayoutPanel1.SetRow(six, 5);
    }
}

这给了我:

enter image description here

现在,您可以看到我们正在动态添加这些内容。我希望您可以在WinForm中使用它时想象如何“自定义”此用户控件。在同一个文件中,您将需要添加一些Getters / Setters /函数,具体取决于您想要执行的操作,就像其他用户控件一样;所以,AddAdditionalRow(RowContext rc)等等。实际上我作弊并将tableLayoutPanel更改为public,以便最快加快速度。

最后,您拥有将保留自定义对象的ContentCollection,现在需要将其添加到表单中。

转到您的表单,打开工具箱并滚动到顶部以查看您的表单!将其拖放到主窗体上并将其拖放。现在,要迭代RowContent,这很容易。由于我将用户控件拖放到表单上,因此我能够为其命名(userControl12)并立即开始访问控件。看看我如何为每个其他复选框添加复选标记并动态更改步进索引:

public partial class Form1 : Form
{
    static int i = 0;
    public Form1()
    {
        InitializeComponent();
        foreach (RowContent ctrl in userControl11.tableLayoutPanel1.Controls)
        {
            ctrl.SetChkBox1Text = i.ToString();
            if (!ctrl.IsEnabledChecked && i % 2 == 0)
                ctrl.IsEnabledChecked = true;
            i++;
        }
        foreach (RowContent ctrl in userControl12.tableLayoutPanel1.Controls)
        {
            ctrl.SetChkBox1Text = i.ToString();
            i++;
        }
    }
}

enter image description here

我并不是说这是最好的设计......因为它不是,但它说明了如何做这样的事情。如果您有任何问题,请告诉我。