Источник данных CheckedListBox внезапно не работает

#c# #winforms #visual-studio

#c# #winforms #visual-studio

Вопрос:

У меня есть CheckedListBox, который использовал этот код для получения элементов.

 public static void GetDisplayValueList(object clk, string[] kv, string tableName)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        try
        {
            string list = "";
            foreach (string item in kv)
               list  = item   ",";
            string query = "SELECT "   list.Substring(0, list.Length - 1)   " FROM [dbo].["   tableName   "]";
            SqlDataAdapter da = new SqlDataAdapter(query, conn);
            DataSet ds = new DataSet();
            da.Fill(ds);
            ((CheckedListBox)clk).DataSource = ds.Tables[0];
            ((CheckedListBox)clk).DisplayMember = "Description";
            ((CheckedListBox)clk).ValueMember = "Id";
        }
        catch (Exception ex)
        {
            MessageBox.Show("An error has occurred: "   ex.Message, "Error");
        }
    }
}
  

Внезапно он больше не работает и выдает следующую ошибку:

Возникло исключение: ‘System.NullReferenceException’ в системе.Windows.Forms.dll

Что я могу сделать, чтобы исправить это, или есть какой-либо другой способ привязать CheckedListBox к DataTable? Заранее спасибо.

Комментарии:

1. Ваш ds равен нулю, проверьте, почему и исправьте это. Вы можете использовать debug !

2. Вы не показали достаточно кода. Где ds.Tables[0] заполняется? В настоящее время он пуст, поэтому вы получаете сообщение об ошибке.

3. @RoxhensMeraj Возможно, потому, что ваш запрос Select не возвращает никаких результатов.

4. Ну, либо clk или ds.Tables[0] равно нулю, чтобы вы получили эту ошибку.

5. FWIW: я столкнулся с точно такой же ошибкой. По-видимому CheckedListBox , объект внутренне выбрасывает (и обрабатывает?) ошибка при присвоении DataSource свойства с помощью a List<KeyValuePairs<string,string>> . Тем не менее, [при игнорировании ошибки] все работает отлично. Очень жаль, что ошибка теперь игнорируется во всем сеансе отладки, поскольку она является важной.

Ответ №1:

Я не думаю, что дам ответ, но я бы помог вам улучшить некоторые строки кода.

Получение строки из массива, разделенной любым разделителем:

 string list = string.Join(",", kv);
  

Если строка станет немного запутанной со всеми операторами:

 string query = string.Format("SELECT {0} FROM [dbo].[{1}]", list, tableName);
// Or
string query = $"SELECT {list} FROM [dbo].[{tableName}]"
  

Чтобы повысить скорость и производительность, попробуйте выполнить приведение только один раз:

 var clb = (CheckedListBox)clk;
clb.DataSource = ds.Tables[0];
clb.DisplayMember = "Description";
clb.ValueMember = "Id";
  

Комментарии:

1. Спасибо за предложения, при установке точки останова, где вы сказали, она прерывается в этой строке кода clb.DataSource = ds.Tables[0]; , и когда я нажимаю Шаг в (F11) один раз, а затем продолжаю , это работает. Мне кажется clb , что это вызывает исключение NullReferenceException, но я не могу понять почему.

2. Вы проверяли ds.Tables[0] , не является ли оно null и имеет элементы со свойствами Description и Id ? Может быть, это помогает установить сначала DisplayMember и ValueMember , а затем DataSource .

3. Когда вызывается ваш метод? Ваша форма полностью отрисована?

Ответ №2:

Основываясь на комментариях к ответам, я думаю, вам нужно подняться выше в вашем стеке вызовов.

Вы говорите, что включена исходная ошибка ((CheckedListBox)clk).DataSource = ds.Tables[0]; . Это означает clk null , что он есть и не может быть использован после приведения к a CheckedListBox , поскольку после приведения он все еще null . (Обратите внимание, это не означает ds.Tables[0] , что значение равно нулю. Для источника данных можно установить значение null для очистки данных.)

Затем, после изменений, внесенных в ответ @Stef Geysels, ошибка находится в строке ниже.

 var clb = (CheckedListBox)clk;     
clb.DataSource = ds.Tables[0];    // <- error here
  

Это дополнительно указывает на то clk , что это значение равно нулю, а при приведении — clb также null .

Все, что сказано, вам нужно проверить, что передается как clk

Комментарии:

1. Я согласен с вами, но почему, когда я снимаю флажок System.NullReferenceException в настройках исключений , решение работает нормально? @CDspace