【问题标题】:How to use a list of strings as listbox's datasource如何使用字符串列表作为列表框的数据源
【发布时间】:2011-08-16 10:40:01
【问题描述】:

这是我编写的代码,它通常可以工作,但有时会失败(4 次中的 1 次或多或少):

...
List<string> _items = new List<string>(); 
...
using (SqlCeConnection con = new SqlCeConnection(Globals.conString))
{
    string codbultocomp = null;
    con.Open();
    using (SqlCeCommand cmd = new SqlCeCommand("SELECT codbultocomp FROM envios WHERE codigodestino=@codigodestino AND estado=@pendiente", con))
    {
        cmd.Parameters.AddWithValue("@codigodestino", codigoDestino);
        cmd.Parameters.AddWithValue("@pendiente", "pendiente");

        SqlCeDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            codbultocomp = reader["codbultocomp"].ToString();
            _items.Add(codbultocomp);
        }
        reader.Close();
    }
    listBox1.DataSource = _items;
} 

当它失败时,应用程序会冻结,如果我暂停调试,它会在最后一个大括号中停止。我尝试使用 try/catch 块显示错误,但它没有显示任何内容并停在同一个地方。我还尝试观察列表框数据源在“观察”列表中显示此错误:

Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

知道我做错了什么吗?

【问题讨论】:

  • 这是在后台线程上运行的吗?
  • 这是一个 Windows CE 应用程序。该应用程序以具有不同选项的菜单开始,此代码来自选项之一。当在菜单中选择一个选项时,会出现一个代表该选项的新表单,并且菜单表单留在后面。

标签: c# list listbox datasource


【解决方案1】:

在你的using之后调用它,所有IDisposable对象都会在using之后被释放。

...
List<string> _items = new List<string>(); 
...
using (SqlCeConnection con = new SqlCeConnection(Globals.conString))
{
     ...
} 

listBox1.DataSource = _items;

【讨论】:

  • 我改了,但问题依旧。
  • @rfc1484,我建议使用实体框架目前我无法测试您的应用程序但可能是 reader.Close() 在这里是错误的,但请参阅weblogs.asp.net/scottgu/archive/2010/07/16/… 中的示例实体框架工作用法防止这种情况,您的问题是使用 EF 进行简单的 linq。
【解决方案2】:

你为什么不试试这样的:

要获得清晰的代码,请创建如下方法:

public List<string> getItems(string codigodestino, string pendiente)
{
    List<string> _items = new List<string>();
    SqlCeConnection con = new SqlCeConnection(Globals.conString);
    string Qyery = "SELECT codbultocomp FROM envios WHERE codigodestino='" + codigodestino + "' AND estado='" + pendiente +"'";
    try
    {
        con.Open();
        SqlCeCommand cmd = new SqlCeCommand(Qyery, con);
        cmd.CommandType = CommandType.Text;
        SqlCeDataReader rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            _items.Add((string)reader["codbultocomp"]);
        }
        con.Close();
        return _items;
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        con.Dispose();
        con.Close();
    }
}

然后只需使用:

listBox1.DataSource = getItems(codigoDestino, "pendiente");

【讨论】:

    【解决方案3】:

    你只需关闭 con 对象。也无需关闭阅读器。使用 con 对象需要注意。不需要休息。

    【讨论】:

    • 我认为这不是问题,请参阅 MSDN 示例(msdn.microsoft.com/en-us/library/…)
    • 无论如何我用那个更正再次尝试了它,但应用程序仍然不时在同一个地方冻结。
    • @rfc1484,我没有提出答案,而是要求您简化代码以便更好地理解和简化代码。
    猜你喜欢
    • 2011-11-07
    • 2022-11-13
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多