2

我在设计时创建了 9 个文本框。通过单击一个列表框(在设计时创建的列表)我选择一个项目,IfThisExist(CmpStr) 函数验证我是否已经选择了这个。当我调试 CmpStr 的值被传递给 txt.Text 但它没有显示在屏幕上。

string CmpString;
bool SelectedExist;
CmpSt r = Convert.ToString(inglist.Items[inglist.SelectedIndex]);
SelectedExist = IfThisExist(CmpStr);

if (inglist.SelectedIndex > -1 && rows > 0 && SelectedExist == false)
{
  foreach (Control txt in mypanel.Controls)
  {
    if (txt is TextBox && txt.Text == "" )
    {
      txt.Text = CmpStr;
      break;
    }
    else if (txt is TextBox && txt.Text == CmpStr)
        break;
  }

如果我用下面的方法做同样的事情,它会起作用。

//for (int j = 0; j < rows; ++j)
//{
//   switch (j + 1)
//{
//  case 1:
//    if (textBox1.Text == "" && textBox1.Text!= CmpStr) 
//  {
//    textBox1.Text = CmpStr;
//  passed = true;
//   }
//  break;

......

可能是什么原因?

4

3 回答 3

2

抱歉打扰了,foreach 循环从较大的 tabindex 开始到较低的。当我隐藏未使用的文本框时,这是接收 CmpStr 值的更大的 tabindex 文本框。

if (inglist.SelectedIndex > -1 && rows > 0 && SelectedExist == false)
{
            
    foreach (Control txt in mypanel.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
    {
        if (txt is TextBox && txt.Text == "")
        {
            txt.Text = CmpStr;
            break;
        }
        else if (txt is TextBox && txt.Text == CmpStr)
            break;
    }
}

    

这很好用。

于 2013-09-20T02:28:00.083 回答
1

我认为你的问题可以改进,但如果我理解正确,你想通过你的文本进行迭代。

编辑(以适应以下评论):

另外,缺少一些代码,因为我不知道您的switch陈述,您的情况(j+1),我不知道代码的上下文。

忽略你的 switch statemente,我建议你的代码看起来像这样:

string CmpString;
Boolean SelectedExist;
CmpStr=Convert.ToString(inglist.Items[inglist.SelectedIndex]);
SelectedExist = IfThisExist(CmpStr);

if (inglist.SelectedIndex > -1 && rows > 0 && SelectedExist == false)
{
    var sortedTextboxes = mypanel.Controls
        .OfType<TextBox>() // get all textboxes controls
        .OrderBy(ctrl => ctrl.TabIndex); // order by TabIndex

    foreach (TextBox txt in sortedTextboxes)
    {
        // No need to cast :)

        if(txt.Text == "") 
        {  
            tBox.Text = CmpStr;
            break;
        }

        if(txt.Text == CmpStr) { break; }
    }
}

注意这个OfType<TextBox>方法,它只返回文本框。

但是,如果不进行修改,此代码并没有多大帮助,因为文本只有在为空时才会设置为文本框。 再次调整代码以满足您的需求。

于 2013-09-19T16:26:09.577 回答
0
foreach (Control txt in mypanel.Controls) {
    if (txt is TextBox) {
        if ((txt as TextBox).Text == "") {
            (txt as TextBox).Text = CmpStr;
            break;
        } else if ((txt as TextBox).Text == CmpStr) {
            break;
        }
    }
}
于 2013-09-19T13:36:02.483 回答