我有一个使用此代码获取项目的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.Windows.Forms.dll中的'System.NullReferenceException'
我该怎么做才能解决这个问题,或者有没有其他方法可以将CheckedListBox绑定到DataTable? 提前谢谢。
答案 0 :(得分: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";
答案 1 :(得分:2)
根据对答案的评论,我认为你需要在你的调用堆栈中走得更高。
您说原始错误在((CheckedListBox)clk).DataSource = ds.Tables[0];
上。这意味着clk
为null
,并且在投放到CheckedListBox
后无法使用,因为在投射后它仍然是null
。 (注意,这并不意味着ds.Tables[0]
为空。可以将DataSource设置为null
以清除数据。)
然后在@DDD Soft的回答发生变化之后,错误就在下面一行。
var clb = (CheckedListBox)clk;
clb.DataSource = ds.Tables[0]; // <- error here
这进一步指出clk
为空,在投标时,clb
随后也是null
。
所有这一切,您需要检查传递的内容为clk