Получение ошибки исключения Null в цикле.Попытка отладки - PullRequest
4 голосов
/ 24 февраля 2010

У меня возникли некоторые проблемы при разборе строки для типа текстового поля, я использую код в другой форме в программе и все работает нормально, но при имплантации этих двух строк здесь я получаю нулевое исключение

две линии интереса

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

новая информация

Грег указал мне, чтобы проверить, что находится внутри массива Controls [], и это показывает, в чем моя проблема. Он содержит только 90 строк информации TabControl.

это строка

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

эта строка дублируется 90 раз, когда я запускаю этот код внутри моего блока catch

                catch( System.Exception excep)
                {
                    System.IO.StreamWriter SW;
                    SW = File.AppendText("C:\\MyDumpFile.txt");

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

как это может быть, если массив Controls не заполнен при Initialize?


Оригинальный пост

и это полный цикл

        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 в Textbox в этой строке txtBCont = br1txtB1; но в элементах управления txtBCont = (TextBox) [txbName]; он снова устанавливает его в ноль.

кто-нибудь понял, в чем здесь ошибка?

Ответы [ 5 ]

2 голосов
/ 24 февраля 2010

При попытке извлечь что-то из хэша или словаря вы получите нулевое значение, если оно не существует.В этом случае элемент управления по имени, которое вы ищете, не существует.Я заметил, что ваш индекс второго цикла начинается с 1:

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

Возможно, вы выключены на 1, а элемент управления не существует?

1 голос
/ 24 февраля 2010

Установите точку останова на линии MessageBox.Show(excep.Message); и запустите код.

Проверьте значение txtBCont с помощью отладчика.
Проверьте свойства Name всех элементов в Controls, используя отладчик.

Ваше предположение, что существуют контролы, где bruker> = 0 и <= 17 верны? <br> Вы предполагаете, что существуют элементы управления, где o> = 1 и

Редактировать: этот код (или что-то близкое к нему) должно выводить Имя всех текстовых полей, чтобы вы могли перепроверить.

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

Редактировать 2:

Я предполагаю, что вы используете проект Windows Forms. Проблема в том, что элементы управления находятся не в массиве, а в иерархии. TabControl имеет свое собственное свойство Controls, которое содержит TabPages. Каждая вкладка имеет свою собственную коллекцию элементов управления ... и т. Д.

Метод Find в свойстве Controls может выполнять рекурсивный поиск по этой иерархии. К сожалению, он может вернуть более одного элемента управления, поэтому вам необходимо учитывать это. В приведенном ниже коде я сделал предположение, что в форме может существовать только один элемент управления с именем запроса, и я выдал исключение, если это не так.

        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 лучшим выбором здесь ...

1 голос
/ 24 февраля 2010

Я не буду открывать и закрывать ваше соединение каждый раз внутри цикла, открывать его до цикла и закрывать после.

1 голос
/ 24 февраля 2010

Try

string txbName = string.Format("br{0}txt'{1}'{2}", bruker, "B", o);
1 голос
/ 24 февраля 2010

Возможно ли, что строка, созданная в txbName, не существует в массиве Controls? Элементы управления [txtbName] могут не существовать и поэтому будут возвращать ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...