2016-10-18 5 views
2

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

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"); 
     } 
    } 
} 

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

Exception thrown: 'System.NullReferenceException' in System.Windows.Forms.dll

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

+1

Вашего ца является нулевым чеком, почему и исправить ее. Вы можете использовать debug! – mybirthname

+0

У вас недостаточно кода. Где заполняется 'ds.Tables [0]'? Он пуст, поэтому вы получаете ошибку. – Equalsk

+0

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

ответ

2

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

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

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

Если строка будет немного перепутались, с аль в + операторах:

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

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

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

Благодарим за предложения при размещении точки останова, где вы сказали, она разбивается на эту строку кода 'clb.DataSource = ds.Tables [0];' и когда я нажимаю ** Step Into (F11) ** один раз, а затем ** Продолжить ** это работает. Мне кажется, что 'clb' выбрасывает исключение NullReferenceException, но я не могу понять, почему. –

+0

Проверено ли 'ds.Таблицы [0] 'не являются нулевыми и имеют элементы со свойствами' Описание' и 'Id'? Возможно, это помогает установить первые «DisplayMember» и «ValueMember», а затем «DataSource». –

+0

Когда ваш метод называется? Полная форма вашей формы? –

2

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

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

Затем после изменения от ответа @DDD Soft, тем ошибка на строке ниже.

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

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

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

+0

Я согласен с вами, но как получилось, когда я сниму ** Исключение System.NullReferenceException ** в ** Исключение настроек ** решение работает нормально? @CDspace –

Смежные вопросы