在标签页上,有33个文本框,我正在尝试使用tabindex 13到33来获取文本框的值。我已将所有选项卡索引设置为这些数字但由于某些原因无法使其工作。
我目前的代码:
int startTabIndex = 13;
int endTabIndex = 33;
foreach (Control ctrl in Controls)
{
if (ctrl is TextBox)
{
if (ctrl.TabIndex == startTabIndex || ctrl.TabIndex <= endTabIndex)
{
MessageBox.Show(ctrl.Text);
}
}
}
MessageBox.Show(ctrl.Text)
只是一个测试,看看它是否正常工作。
另外,这可以通过使用LINQ来完成吗?
我改变了我的代码,使用LINQ根据Steve提供的答案获取文本框的值(名称和文本)。我究竟将如何检查值是否已通过(如在消息框中显示文本或其他内容)?
int startTabIndex = 13;
int endTabIndex = 33;
System.Collections.Generic.Dictionary<string, string> dictionary = Controls.OfType<TextBox>()
.Where(t => t.TabIndex >= startTabIndex && t.TabIndex <= endTabIndex)
.Select(x => new System.Collections.Generic.KeyValuePair<string, string>(x.Name, x.Text))
.ToDictionary(z => z.Key, z => z.Value);
foreach (var d in dictionary)
{
MessageBox.Show(d.Value);
}
当我点击插入按钮时,没有任何反应。有什么我想念的吗?
史蒂夫给了我一个很好的例子,但它起作用但它从文本框的末尾开始(tabindex 33)并一直向前进行到开始(tabindex 13)。如何逆转这个?答案 0 :(得分:3)
你可以在一行中使用OfType(仅获取文本框)a Where(仅选择tabindex范围内的文本框),最后选择从TextBoxes的Text属性中提取字符串
int startTabIndex = 13;
int endTabIndex = 33;
List<string> texts = Controls.OfType<TextBox>()
.Where(t => t.TabIndex >= startTabIndex &&
t.TabIndex <= endTabIndex)
.OrderBy(b => b.TabIndex)
.Select(x => x.Text).ToList();
要获得Dictionary<string,string>
,代码可以更改为
Dictionary<string, string> dic = Controls.OfType<TextBox>()
.Where(t => t.TabIndex >= startTabIndex &&
t.TabIndex <= endTabIndex)
.OrderBy(b => b.TabIndex)
.Select(x => new KeyValuePair<string,string>(x.Name, x.Text)
.ToDictionary(z => z.Key, z => z.Value);
foreach(KeyValuePair<string,string>kvp in dic)
MessageBox.Show($"Key={kvp.Key} = {kvp.Value}");
更新
还添加了OrderBy以确保根据TabIndex进行枚举以回答OP的最后一个请求(感谢CodingYoshi)。