多列Listview填充数据不会显示

时间:2016-06-20 10:16:10

标签: c# winforms

我需要一个东西的帮助,我已经通过后台工作者填充了一个列表视图,但它似乎在循环结束时有一个行计数,但是数据没有在listview上直观显示。我真的不知道发生了什么。 后台工作程序进程完成后。香港专业教育学院放了一个消息框来显示列表视图项目计数,但它没有显示列表视图上的数据。请看图片。 谢谢

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            listView1.View = View.Details;
            DataTable dtdt = new DataTable();
            dtdt = qr.history(); // query in sql to datatable

            for (int i = 0; i < dtdt.Rows.Count; i++)// loop data to listviewitem
            {

                DataRow dr = dtdt.Rows[i];
                ListViewItem listitem = new   ListViewItem(dr["custnum"].ToString());
                listitem.SubItems.Add(dr["custname"].ToString().Trim());
                listitem.SubItems.Add(dr["ratecable"].ToString().Trim());
                listitem.SubItems.Add(dr["rateinternet"].ToString().Trim());
                listitem.SubItems.Add(dr["rateext"].ToString().Trim());
                listitem.SubItems.Add(dr["status"].ToString().Trim());
                listitem.SubItems.Add(dr["classname"].ToString().Trim());
                listitem.SubItems.Add(dr["SVCstadd"].ToString().Trim());
                listitem.SubItems.Add(dr["SVCctadd"].ToString().Trim());
                listitem.SubItems.Add(dr["svctelno"].ToString().Trim());
                listitem.SubItems.Add(dr["bilstadd"].ToString().Trim());
                listitem.SubItems.Add(dr["bilctadd"].ToString().Trim());
                listitem.SubItems.Add(dr["billtel"].ToString().Trim());
                listitem.SubItems.Add(dr["billtel2"].ToString().Trim());
                listitem.SubItems.Add(dr["fax"].ToString().Trim());
                listitem.SubItems.Add(dr["zoneno"].ToString().Trim());
                listitem.SubItems.Add(dr["zoneName"].ToString().Trim());
                listitem.SubItems.Add(dr["bookno"].ToString().Trim());
                listitem.SubItems.Add(dr["seqno"].ToString().Trim());
                listitem.SubItems.Add(dr["Balance"].ToString().Trim());
                listitem.SubItems.Add(dr["balance1"].ToString().Trim());
                listitem.SubItems.Add(dr["balance2"].ToString().Trim());
                listitem.SubItems.Add(dr["balance3"].ToString().Trim());
                listitem.SubItems.Add(dr["billamnt"].ToString().Trim());
                listitem.SubItems.Add(dr["maxdate"].ToString().Trim());



                 this.BeginInvoke(new MethodInvoker(delegate { additemtoLV(listitem); }));


            }
            System.Threading.Thread.Sleep(100);

        }


 private delegate void additemtoLVdelegat(ListViewItem ls);

    public void additemtoLV(ListViewItem ls)
    {
        if (InvokeRequired)
        {
            Invoke(new additemtoLVdelegat(additemtoLV), ls);
        }
        else
        {
            listView1.Items.Add(ls);
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:1)

进一步发布评论请尝试以下,这应该正确使用GUI线程,并且还有基本的异常处理,以防未处理的异常导致问题:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        listView1.View = View.Details;
        DataTable dtdt = new DataTable();
        dtdt = qr.history(); // query in sql to datatable
        var listItems = new List<ListViewItem>();

        for (int i = 0; i < dtdt.Rows.Count; i++)// loop data to listviewitem
        {
            DataRow dr = dtdt.Rows[i];
            ListViewItem listitem = new ListViewItem(dr["custnum"].ToString());
            listitem.SubItems.Add(dr["custname"].ToString().Trim());
            listitem.SubItems.Add(dr["ratecable"].ToString().Trim());
            listitem.SubItems.Add(dr["rateinternet"].ToString().Trim());
            listitem.SubItems.Add(dr["rateext"].ToString().Trim());
            listitem.SubItems.Add(dr["status"].ToString().Trim());
            listitem.SubItems.Add(dr["classname"].ToString().Trim());
            listitem.SubItems.Add(dr["SVCstadd"].ToString().Trim());
            listitem.SubItems.Add(dr["SVCctadd"].ToString().Trim());
            listitem.SubItems.Add(dr["svctelno"].ToString().Trim());
            listitem.SubItems.Add(dr["bilstadd"].ToString().Trim());
            listitem.SubItems.Add(dr["bilctadd"].ToString().Trim());
            listitem.SubItems.Add(dr["billtel"].ToString().Trim());
            listitem.SubItems.Add(dr["billtel2"].ToString().Trim());
            listitem.SubItems.Add(dr["fax"].ToString().Trim());
            listitem.SubItems.Add(dr["zoneno"].ToString().Trim());
            listitem.SubItems.Add(dr["zoneName"].ToString().Trim());
            listitem.SubItems.Add(dr["bookno"].ToString().Trim());
            listitem.SubItems.Add(dr["seqno"].ToString().Trim());
            listitem.SubItems.Add(dr["Balance"].ToString().Trim());
            listitem.SubItems.Add(dr["balance1"].ToString().Trim());
            listitem.SubItems.Add(dr["balance2"].ToString().Trim());
            listitem.SubItems.Add(dr["balance3"].ToString().Trim());
            listitem.SubItems.Add(dr["billamnt"].ToString().Trim());
            listitem.SubItems.Add(dr["maxdate"].ToString().Trim());

            listItems.Add(listitem);
        }

        this.BeginInvoke(((Action)(() => { listView1.Items.AddRange(listItems.ToArray()); })));
    }
    catch (System.Exception exc)
    {
        this.BeginInvoke(((Action)(() => { MessageBox.Show("BackgroundWorker error: " + exc);})));
    }
}