0

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

在此处输入图像描述

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

4

1 回答 1

0

好的,我认为我已经实现了您对 Sport 的期望,我比 WinForms 更了解 WPF,但这是我自己“自学”的解决方案。

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

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

控制

确保你有你的名字你的控件。所以对于复选框,我将其命名为 stprIndex_chkBox、enable_chkBox 等。

现在您需要为使用的每个控件实现所需的功能。所以,你会想要改变你的stprIndex_chkBox.Text, 和enable_chkBox.Checkedfor starters 的值。您还将想要访问Value您的 numericUpDowns。因此,在 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/functions,具体取决于您想要执行的操作,就像其他用户控件一样;所以,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++;
        }
    }
}

在此处输入图像描述

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

于 2012-08-14T19:16:09.663 回答