CheckedListBox DataSource突然无法正常工作

时间:2016-10-18 10:27:43

标签: 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.Windows.Forms.dll中的'System.NullReferenceException'

我该怎么做才能解决这个问题,或者有没有其他方法可以将CheckedListBox绑定到DataTable? 提前谢谢。

2 个答案:

答案 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];上。这意味着clknull,并且在投放到CheckedListBox后无法使用,因为在投射后它仍然是null。 (注意,这并不意味着ds.Tables[0]为空。可以将DataSource设置为null以清除数据。)

然后在@DDD Soft的回答发生变化之后,错误就在下面一行。

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

这进一步指出clk为空,在投标时,clb随后也是null

所有这一切,您需要检查传递的内容为clk