如何推广这个C#代码?

时间:2017-04-03 10:49:07

标签: c# winforms

我有这个代码初始化winforms文本框。

txt0.Text = steps[0];
txt1.Text = steps[1];
txt2.Text = steps[2];
txt3.Text = steps[3];

我想像这样概括一下:

for (int i = 0; i < steps.Length; i++)
{
    txti.Text = steps[i];
}

显然这不起作用,因为the name txti does not exist in current context。 如何使它工作?

编辑: 我想避免在代码中创建所有文本框和图片框,并将它们添加到代码中的tablelayoutpanel。

6 个答案:

答案 0 :(得分:2)

你可以用反射来做,但我不建议它来解决这个任务。

而是有一个List并循环遍历它。

List<TextBox> textBoxes = new List<TextBox> {txt0,txt1,txt2,txt3};
for (int i = 0; i < textBoxes.Length; i++)
{ 
    textBoxes[i].Text = steps[i];
} 

答案 1 :(得分:1)

原始问题中的代码可以概括如下。

var TextBoxes = new TextBox[]{ txt0, txt1, txt2, txt3 };
for (int i = 0; i < TextBoxes.Length; i++)
{
    TextBoxes[i].Text = steps[i];
}

答案 2 :(得分:1)

您可以执行类型转换以动态引用文本框。

for (int i = 0; i < steps.Length; i++)
{
    TextBox txt = this.FindControl("txt" + i.ToString()) as TextBox;
    txt.Text = steps[i];
}

答案 3 :(得分:1)

您可以尝试按名称查找控件:

for (int i = 0; i < steps.Length; i++)
  Controls.Find("txt" + i, true)[0].Text = steps[i];

答案 4 :(得分:1)

由于它是WinForms,您可以使用Name的{​​{1}}属性。

TextBox
for( int i = 0; i < steps.Length; i++ ) { TextBox tBox = this.Controls.OfType<TextBox>().FirstOrDefault(t => t.Name == "txt" + i); if(tBox == null) break; tBox.Text = steps[i]; }

Name属性与您使用的变量名称相对应,这意味着如果您将Control称为TextBox,则其名称为{{1}使用此名称可以很容易地从它的父txt0中检索。

答案 5 :(得分:1)

Winforms有&#34;对&#34;用于显示集合数据的控件 - 例如import React from 'react'; import ReactDOM from 'react-dom'; const CardView = React.createClass({ render() { var fontFamily = this.props.fontFamily; var fontSize = this.props.fontSize; var coinName = this.props.coinName; var Type = this.props.type; var longTextList = this.props.data.map(function(text, index){ return <Type key={index} style={fontSize} ><div style={fontFamily}><img src={text.sprite} />{text.longText} and get {coinName}(s)</div></Type>; }); return ( <div>{longTextList}</div> ); } }); export default CardView;

DELETE t
FROM (SELECT TOP (1) uph.*
      FROM dbo.userPasswordHistory uph
      WHERE UserId IN (SELECT Id
                       FROM dbo.user
                       WHERE LogonId = @UserLogonId
                      )
      ORDER BY LastModifiedTime DESC
     ) t;

DataGridView将生成行和一列,其中包含yourDataGridView.DataSource = steps.ToList(); 的值。对于自动生成列,您需要确保DataGridView - (默认情况下为steps

你可以&#34;风格&#34;使用yourDataGridView.AutoGenerateColumns = true属性或其他属性生成单元格。

如果您需要显示图片以外的文字,那么true似乎&#34;对&#34;选择。
创建一个表示步骤

的数据结构的类
DataGridView.DefaultCellStyle

DataGridView应为public class Step { public string Name { get; set; } public Image StatusImage { get; set; } } // Create collection var steps = new List<Step> { new Step { Name = "One", StatusImage = image1 }, new Step { Name = "Two", StatusImage = image1 }, new Step { Name = "Three", StatusImage = image1 } } yourDataGridView.DataSource = steps; 属性生成DataGridView

如果您有DataGridViewImageColumn的枚举而不是图片。然后,您可以使用StatusImage事件将枚举转换为图像。