#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
свойства с помощью aList<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