CheckedListBox 数据源突然不起作用

rox*_*ens 5 c# visual-studio winforms

我有一个 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

突然,它不再工作并给出以下错误:

抛出异常:System.Windows.Forms.dll 中的“System.NullReferenceException”

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

Ste*_*els 2

我不认为我会提供答案,但我会帮助您改进一些代码行。

从数组中获取字符串,用任意分隔符分隔:

string list = string.Join(",", kv);
Run Code Online (Sandbox Code Playgroud)

如果字符串因所有运算符而变得有点混乱+

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

为了提高速度和性能,请尝试仅投射一次:

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