从特定的标签索引开始并在结束处停止

3

在一个标签页上,有33个文本框,我想获取tabindex为13到33的文本框的值。我已将所有的tab索引设置为这些数字,但出于某种原因无法正常工作。

我目前拥有的代码:

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);
}

当我点击插入按钮时,没有任何反应。我有什么遗漏吗?


Steve 给了我一个很好的例子,它有效,但它从文本框的末尾开始(tabindex 33),然后向后处理到开头(tabindex 13)。如何才能颠倒这个顺序呢?


一个未来问题的提示:如果您事先指定您的目标,就不需要进行来回编辑和添加“更新”部分。那些不是更新,而是需求变更。需求变更可能会引起回答者的沮丧,就像它们可能在开发工作中一样。如果您想了解更多信息,请参见相关的元帖 - Palec
1个回答

3

你可以使用 OfType(仅获取文本框)、Where(选择 tabindex 范围内的文本框)和 Select(从 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)。


我该如何将返回值分配给 KeyValuePair<string, string> - user2101411
请解释得更好一些,因为这个KeyValuePair有点不清楚。Key和value分别是什么? - Steve
1
tabPage.Controls(或者你给插入页面命名的任何名称)不是Controls。如果没有确切的容器名称,那么你引用的就是Form.Controls集合。 - Steve
1
工作完成了,感谢您的耐心等待。抱歉,还有一个问题,它首先抓取最后一个索引,然后向后开始。有没有办法将其反转? - user2101411
1
@user2101411 可以使用 OrderBy 按标签索引进行排序,然后再进行选择。 - CodingYoshi
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接