问题描述
我已经完成了以下代码,并且运行良好。我想知道如何执行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");
}