循环中获取Null异常错误。试着调试

时间:2010-02-24 17:02:27

标签: c# debugging textbox loops

我在将字符串解析为文本框类型时遇到一些问题,我在程序中使用不同形式的代码并且工作正常,但是当我在这里使用相同的两行时,我得到一个空异常

这两条线是

string txbName = "br" + bruker + "txt" + 'B' + o;
txtBCont = (TextBox)Controls[txbName];

新信息

Greg让我指向检查waht在Controls []数组中的方向,这揭示了我的问题所在。它只包含90行TabControl信息。

这是

System.Windows.Forms.TabControl, TabPages.Count: 2, TabPages[0]: TabPage: {ShowWeek}

当我在catch块

中运行此代码时,这行被公开了90次
                catch( System.Exception excep)
                {
                    System.IO.StreamWriter SW;
                    SW = File.AppendText("C:\\MyDumpFile.txt");

                    foreach (Control ctrl in Controls)
                    {
                        SW.WriteLine(ctrl);
                    }
                    SW.Close();
                }

如何在Initialize上填充Controls数组?


原始帖子

这是完整循环

        int dayOfset;
        int bruker;

        TextBox txtBCont;

        for (int i = 0; i < 18; i++)
        {
            mysqlCon.Open();
            dayOfset = -4;
            bruker = i + 1;

            for (int o = 1; o < 6; o++)
            {
                MySqlCommand cmd = new MySqlCommand("SELECT  (NyeSaker + GamleSaker - (select GamleSaker FROM saker Where Dato = '" + dateTimePicker1.Value.AddDays(dayOfset + 1).ToString("yyyy-MM-dd") + "' AND Bruker_ID = '" + bruker + "' ) ) FROM saker Where Bruker_ID = '" + bruker + "' AND Dato = '" + dateTimePicker1.Value.AddDays(dayOfset).ToString("yyyy-MM-dd") + "'", mysqlCon);

                string txbName = "br" + bruker + "txt" + 'B' + o;

                txtBCont = (TextBox)Controls[txbName];

                //1   past og dp kontrol//
                try
                {
                    txtBCont.Text = cmd.ExecuteScalar().ToString();
                }
                catch( System.Exception excep)
                {
                    //txtBCont1.Text = "0";   
                    MessageBox.Show(excep.Message);
                }
                dayOfset++;
            }
            mysqlCon.Close();
        } 

试图调试它我做了这个

string txbName = "br" + bruker + "txt" + 'B' + o;
txtBCont = br1txtB1;
txtBCont = (TextBox)Controls[txbName];

并且会发生什么,它将txtBCont设置为此行上的文本框txtBCont = br1txtB1; 但是在txtBCont =(TextBox)控件[txbName];它再次将其设置为null。

任何人都知道这里的错误是什么?

5 个答案:

答案 0 :(得分:2)

当尝试从哈希或字典中提取某些内容时,如果它不存在则会返回空值。在这种情况下,不存在您要查找的名称的控件。我注意到你的第二个循环索引从1开始:

for (int o = 1; o < 6; o++) 

你是否有可能在1以外并且控件不存在?

答案 1 :(得分:1)

控件数组中是否可能存在txbName中构建的字符串?控件[txtbName]可能不存在,因此将返回null。

答案 2 :(得分:1)

Try

string txbName = string.Format("br{0}txt'{1}'{2}", bruker, "B", o);

答案 3 :(得分:1)

我不会每次在循环中打开和关闭你的连接,在循环之前打开它并在之后关闭它。

答案 4 :(得分:1)

在第MessageBox.Show(excep.Message);行设置断点并运行代码。

使用调试器检查txtBCont的值 使用调试器检查Controls中所有项的名称属性。

您是否认为控件中有bruker&gt; = 0且&lt; = 17为真? 您是否假设存在o> = 1且&lt; = 6为真的控件?

编辑:此代码(或与其关闭的内容)应打印出所有文本框的名称,以便您可以仔细检查。

foreach( Control ctrl in Controls )
{
  TextBox textBox = ctrl as TextBox;
  if( textBox != null )
    Console.WriteLine( textBox.Name );
}

编辑2:

我假设您正在使用Windows窗体项目。问题是控件不在数组中,它们在层次结构中。 TabControl有自己的Controls属性,包含TabPages。每个TabPage都有自己的Controls集合......等等。

Controls属性上的Find方法可以在此层次结构上执行递归搜索。不幸的是,它可以返回多个控件,因此您需要考虑到这一点。在下面的代码中,我假设在表单上只能存在一个带有请求名称的控件,如果没有,我会抛出异常。

        Control[] matchingControls = Controls.Find(txbName , true); // true means recursive search

        if (matchingControls.Length == 0 || !(matchingControls[0] is TextBox) )
            throw new InvalidOperationException("No TextBoxes with name " + txbName + " found in the form.");

        if (matchingControls.Length > 1)
            throw new InvalidOperationException("Multiple controls with name " + txbName + " found in the form. Please use unique names");

        txtBCont = (TextBox)matchingControls[0];

注意:我不确定InvalidOperationException是否是最佳选择....