c# - CheckedListBox 数据源突然不工作

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

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

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

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

最佳答案

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

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

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

关于c# - CheckedListBox 数据源突然不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105779/

相关文章:

c# - 为什么要使用小于 32 位的整数?

c# - 更改 Windows 窗体应用程序中的字体大小

c# - OpenTK - 如何旋转二维对象

visual-studio - 在 MSVS2013 IDE 中合并更改时,是否有发生的日志?

visual-studio - 如何将 Visual Studio 设置为默认的事后调试器?

c# - .NET 中的 Getter 和 Setter 声明

c# - 使用 EF 对数字和字母字符串进行排序

c# - MAUI : await Shell. Current.GoToAsync 花费太多时间

c# - 在设计器中打开自定义用户控件时,Visual Studio Professional 15.9.2 崩溃

c++ - 从 CLI C++ 项目引用非托管 C++ 项目