如何使用for循环简化代码以更新许多控件?

问题描述

我已经完成了以下代码,并且运行良好。我想知道如何执行for循环,以将这段代码从38行清除为2行。

        s0s.Text = seg[0].start.ToString("X8");
        s0e.Text = seg[0].end.ToString("X8");
        s1s.Text = seg[1].start.ToString("X8");
        s1e.Text = seg[1].end.ToString("X8");
        // .. many more ..
        s19s.Text = seg[19].start.ToString("X8");
        s19e.Text = seg[19].end.ToString("X8");

我显然可以进行seg[i]替换,但是如何使用文本框呢?

解决方法

我想您可以使用Controls属性并调用OfType<T>()以在您的TextBoxes 实例中获取Form的所有实例>

根据指定的类型过滤IEnumerable的元素。

然后根据控件Dictionary

将结果转换为Name
// this could potentially be done in the constructor
var dict = Controls.OfType<TextBox>().ToDictionary(x => x.Name);

for (int i = 0; i < 19; i++)
{
    dict[$"s{i}s"].Text = $"{seg[i].Start:X8}";
    dict[$"s{i}e"].Text = $"{seg[i].End:X8}";
}

注意:此代码未经测试,仅是可能解决方案的指南

,

我很想这样做。首先创建两个控件列表,分别是开始和结束:

var starts = new List<TextBox>
{
    s0s,s1s,//...
    s19s
};
var ends = new List<TextBox>
{
    s0e,s1e,//...
    s19e
};

然后遍历每个列表:

var i = 0;
foreach (var start in starts)
{
    start.Text = seg[i].start.ToString("X8");
    ++i;
}
i = 0;
foreach (var end in ends)
{
    start.Text = seg[i].end.ToString("X8");
    ++i;
}

尽管如此,您的索引和控件编号仍需要完美对齐。

注意:就像TheGeneral的代码一样,此代码未经测试(我们都不希望创建带有38个带有特定名称的文本框的表单)

,

基于文本框的名称,我建议使用另一种方法来使用设计来显示事物集合的控件-DataGridView将是其中的一种。

通过数据绑定,您可以获得更多可维护的代码

public class MyItem
{
    public int Start { get; set; }

    public int End { get; set; }
}

在窗体中创建一个带有两个有界列的datagridview,您可以在winforms设计器中执行此操作,而无需手动编写下面的代码。

// constructor
public MyForm()
{
    var startColumn = new DataGridViewTextBoxColumn();
    startColumn.DataPropertyName = "Start"; // Name of the property in MyItem class
    startColumn.DefaultCellStyle.Format = "X8";

    var endColumn = new DataGridViewTextBoxColumn();
    endColumn.DataPropertyName = "End"; // Name of the property in MyItem class
    endColumn.DefaultCellStyle.Format = "X8";

    myDataGridView.Columns.AddRange(startColumn,endColumn);
    myDataGridView.AutoGenerateColumns = false; 
}

private void Form1_Load(object sender,EventArgs e)
{
    var items = new List<MyItem>
    {
        new MyItem { Start = 10,End = 20 },new MyItem { Start = 11,End = 19 },new MyItem { Start = 12,End = 18 }
    };

    myDataGridView.DataSource = items;
}
,

首先,在创建它们时,将变量全部插入到数组中。然后运行如下循环:

for (int i; int < 19(your list); i++)
{
    your list[i].Text = seg[i].start.ToString("X8");
    your list[i].Text = seg[i].end.ToString("X8");
}