【问题标题】:CheckedListBox DataSource suddenly not workingCheckedListBox 数据源突然无法正常工作
【发布时间】:2016-10-18 10:27:42
【问题描述】:

我有一个 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? 提前致谢。

【问题讨论】:

  • 您的 ds 为空检查原因并修复它。您可以使用调试!
  • 您没有显示足够的代码。 ds.Tables[0] 在哪里填充?它目前是空的,这就是您收到错误的原因。
  • @RoxhensMeraj 也许是因为您的 Select 查询没有返回任何结果。
  • 好吧,clkds.Tables[0] 为空,您会收到该错误。
  • FWIW:我遇到了完全相同的错误。显然,CheckedListBox 对象在使用List<KeyValuePairs<string,string>> 分配DataSource 属性时会在内部抛出(并处理?)错误。也就是说,[忽略错误时]事情工作得很好。太糟糕了,这个错误现在在整个调试会话中被忽略了,因为它是一个重要的错误。

标签: c# winforms visual-studio


【解决方案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";

【讨论】:

  • 感谢您的建议,在您所说的位置放置断点时,它会在这行代码clb.DataSource = ds.Tables[0]; 处中断,并且当我单击Step Into (F11) 一次然后继续它有效。对我来说,clb 似乎抛出了 NullReferenceException,但我不明白为什么。
  • 您是否检查过ds.Tables[0] 是否不为空并且具有属性DescriptionId 的元素?也许先设置DisplayMemberValueMember 然后DataSource 会有所帮助。
  • 什么时候调用你的方法?你的表单完全渲染了吗?
【解决方案2】:

基于答案的 cmets,我认为您需要在调用堆栈中更高。

你说原来的错误是在((CheckedListBox)clk).DataSource = ds.Tables[0];。这意味着clknull,并且在转换为CheckedListBox 之后不能使用,因为在转换之后它仍然是null。 (注意这并不意味着ds.Tables[0] 为空。可以将DataSource 设置为null 以清除数据。)

然后在@Stef Geysels 的答案发生变化后,错误出现在下面的一行。

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

这进一步指出clk 为空,并且在转换时,clb 随后也是null

话虽如此,您需要检查以clk 传递的内容

【讨论】:

  • 我同意你的看法,但是为什么当我取消选中 Exception Settings 中的 System.NullReferenceException 时,解决方案可以正常工作? @CDspace
猜你喜欢
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多