我在将字符串解析为文本框类型时遇到一些问题,我在程序中使用不同形式的代码并且工作正常,但是当我在这里使用相同的两行时,我得到一个空异常
这两条线是
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。
任何人都知道这里的错误是什么?
答案 0 :(得分:2)
当尝试从哈希或字典中提取某些内容时,如果它不存在则会返回空值。在这种情况下,不存在您要查找的名称的控件。我注意到你的第二个循环索引从1开始:
for (int o = 1; o < 6; o++)
你是否有可能在1以外并且控件不存在?
答案 1 :(得分:1)
控件数组中是否可能存在txbName中构建的字符串?控件[txtbName]可能不存在,因此将返回null。
答案 2 :(得分:1)
Trystring 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是否是最佳选择....