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

C# 如何使用for循环来简化此代码以更新许多控件?,c#,loops,for-loop,textbox,C#,Loops,For Loop,Textbox,我已经完成了以下代码,并且工作得很好。我想知道如何做一个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

我已经完成了以下代码,并且工作得很好。我想知道如何做一个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]
替换,但是如何使用文本框呢?

我想您可以使用属性和调用来获取
表单中
文本框的所有实例

根据指定类型筛选IEnumerable的元素

然后根据控件名将结果转换为字典

// 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 dict=Controls.OfType().ToDictionary(x=>x.Name);
对于(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
};
不过,您的索引和控件编号需要完全对齐


注意:与General的代码一样,这是未经测试的(我们都不想创建一个包含38个具有特定名称的文本框的表单)

基于文本框名称,我建议使用用于显示内容集合的控件的替代方法-DataGridView将是选项之一

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

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

    public int End { get; set; }
}
在表单中创建一个包含两个有界列的datagridview,您可以在winforms designer中执行此操作,而无需手动编写下面的代码

// 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;
}
//构造函数
公共MyForm()
{
var startColumn=新的DataGridViewTextBoxColumn();
startColumn.DataPropertyName=“开始”;//MyItem类中属性的名称
startColumn.DefaultCellStyle.Format=“X8”;
var endColumn=新的DataGridViewTextBoxColumn();
endColumn.DataPropertyName=“End”;//MyItem类中属性的名称
endColumn.DefaultCellStyle.Format=“X8”;
myDataGridView.Columns.AddRange(startColumn,endColumn);
myDataGridView.AutoGenerateColumns=false;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
var items=新列表
{
新的MyItem{Start=10,End=20},
新的MyItem{Start=11,End=19},
新MyItem{Start=12,End=18}
};
myDataGridView.DataSource=项目;
}

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

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");
}
for(int i;int<19(您的列表);i++)
{
您的列表[i].Text=seg[i].start.ToString(“X8”);
您的列表[i].Text=seg[i].end.ToString(“X8”);
}

你能澄清一下seg是什么类型吗?seg是一个数组,我在其中存储段信息。正如这里所定义的。字节[]bin;段[]seg;不清楚什么是
对象。你能展示一下它的结构吗?我只是对测试中不存在的
.start
.end
属性感到困惑。如果
dict
中的一个键与字符串“sXs”或“sXe”不匹配,代码不会崩溃吗?代码正在抓取所有文本框。此外,如果文本框少于19个,该怎么办?我想你至少应该用一些容器把这些文本框分组。@JohnG是的,假设这些文本框是存在的。你是对的,它会抓取所有的文本框,如果它们是某个控件的父控件(在更复杂的表单上)可能会更好。我同意,但我仍然不确定seg
是什么?我不知道
.start
.end
是什么意思
seg
不是字符串数组或列表。seg只是段的缩写,它是一个名称。是的,但是s 0 s.text呢。i必须与s之间的数字匹配。。。例如s1s.Text=seg[1].start.ToString(“X8”);等等。如果我必须这样做,那么它与我现在拥有的没有太大的不同。我可能在代码中还有一些字母,但仅此而已。我仍然需要一个接一个地定义它。我正在寻找一种方法,可以将变量添加到名称的中间字母,这样我就可以用循环引用它。@highlander:不同的是,在我的例子中,您首先要声明要对哪些对象进行操作,然后描述要执行的操作。如果您的规格发生变化,并且您需要对这些控件执行一些不同的操作,那么您所需要做的就是更改其中一个或两个短循环。在原始代码中,您需要仔细修改38行密集代码。在编写代码时,应该始终考虑可维护性
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");
}