Как использовать список строк в качестве источника данных listbox - PullRequest
3 голосов
/ 16 августа 2011

Вот код, который я сделал, он обычно работает, но иногда не работает (1 из 4 раз больше или меньше):

...
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.

Есть идеи, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Позвоните после вашего using, все объекты IDisposable будут удалены после using.

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

listBox1.DataSource = _items;
1 голос
/ 16 августа 2011

Почему бы вам не попробовать что-то вроде этого:

Для понятного кода создайте метод, подобный:

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");
0 голосов
/ 16 августа 2011

Вы просто закрываете объект con. Не нужно закрывать и читателя. Использование con объекта заботится. Использование покоя не требуется.

...