我正在尝试为多个对象创建某种类型的控件列表。该对象用于在屏幕上显示的图案,并具有若干不同的属性,例如持续时间,偏移,下一个图案,图案索引。我希望能够创建一个可迭代的控件列表,这样我就可以轻松地在GUI中设置每个模式的不同属性。这是我正在创建的形式的草稿。这是我正在创建的表单的链接。
每一行都是模式的属性集合。我希望能够以某种方式迭代代码中的每一行,并根据用户输入设置每个模式的属性。从我到目前为止所读到的,我想我想使用ItemsControl工具并以某种方式将其绑定到GUI,但我不确定如何做到这一点,或者这是我应该做的。我现在使用的是具有多个Panel的TableLayoutPanel,但似乎这些工具中没有太多控制权。我应该如何将每一行的控件组合在一起,然后有效地遍历每一行?
答案 0 :(得分:0)
好吧我认为我已经实现了你的体育运动,我知道WPF比WinForms更好,但这是我的解决方案,我只是自己“自学成才”。
我将假设在您的解决方案中执行此操作不会有任何问题。
首先创建一个用户控件。我右键单击了我的WinForm项目>添加>用户控制。这是您要添加组成行的内容的地方。所以它看起来应该是这样的,我将我的用户控件命名为RowContent:
确保您的名字是您的控件。因此,对于复选框,我将其命名为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);
}
}
这给了我:
现在,您可以看到我们正在动态添加这些内容。我希望您可以在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++;
}
}
}
我并不是说这是最好的设计......因为它不是,但它说明了如何做这样的事情。如果您有任何问题,请告诉我。