我正在嘗試創建一個帶有 20 個文本框的視窗表單應用程式,命名為“TB1”、“TB2”、.... 問題是,如果我必須使用 20 個單獨的文本框,它可能真的很煩人。有什么方法可以創建一個串列,例如:TB[],然后將 TB1 分配給 TB[0],將 TB2 分配給 TB[1],...?
謝謝你。
uj5u.com熱心網友回復:
它們已經在串列中;必須將它們添加到 ControlCollection 才能顯示在表單上
this.Controls.OfType<TextBox>().Where(tb => tb.Name.StartsWith("TB"))
例如,將為您提供它們(它直接在表單上選擇所有文本框,名稱以 TB 開頭。如果您有其他文本框也稱為 TBx,而您不希望在其中包含這些文本框,則選擇另一個標識您確實想要的那些,或者例如重命名您感興趣的控制元件,以便您可以通過名稱中的模式來選擇它們)
您可以將其放在建構式中的類級別串列中:
class YourForm: Form{
private List<TextBox> _tbList;
YourForm(){
InitializeComponent();
tbList = Controls.OfType<TextBox>().Where(tb => tb.Name.StartsWith("TB")).ToList();
}
}
然后你可以做一些事情,比如清除所有這些:
_tbList.ForEach(tb => tb.Clear());
List 用于授予對 ForEach 的訪問權限;這是一個 List 的東西,而不是 LINQ 的東西 - 普通陣列沒有 ForEach。如果您使用陣列而不是串列,則需要撰寫例如foreach(var tb in _tbArray) tb.Clear();,但總體效果相同
請注意,如果您的文本框在面板或組框中,它們將不在this.Controls它們將在thePanel.Controls
注意2,如果順序很重要,那么您可以使用以下命令正確排序 TB1、TB2 .. TB9、TB10 ......
Controls.OfType<TextBox>()
.Where(tb => tb.Name.StartsWith("TB"))
.OrderBy(tb => (tb.Name.Length, tb.Name))
uj5u.com熱心網友回復:
使用控制元件集合的替代方法。訣竅是將它們全部連接到一個事件處理程式:
private TextBox[] TB = new TextBox[19];
public void Form_Load(object sender, EventArgs e){
for (int i = 0 ; i < 20; i )
{
TB[i].Name = "TB" i.ToString();
// Set Location, Visible & Text
TB[i].Changed = TextBox_Changed;
}
}
private void TextBox_Changed(object sender, EventArgs e)
{
TextBox txt = sender as TextBox;
int i = Convert.ToInt32(txt.Name.Replace("TB", string.Empty));
Console.Write(TB[i].Text " has changed");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465953.html
上一篇:取消Task.Run作業
