C#刷新列表视图

时间:2016-05-09 05:19:43

标签: c# winforms listview

我已经为这个工作了一个小时,但我仍然不知道为什么在点击对话框中的“NO”按钮后没有刷新listview的原因是什么。

我有frmCompanyList(主窗体),下面是listview,我有frmCompanyEntry(childform)。

我已经尝试使用此Refresh(),但它无效。但是如果我点击我的frmCompanyList中的“刷新”按钮就可以了。

所以这是我的代码:

frmCompanyEntry:

DialogResult dialogResult = MessageBox.Show(Global._strInsertAgainMsg + "company?", Global._strTitleMsg, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
    clearAll();
}
else if (dialogResult == DialogResult.No)
{
    this.Close();
    clearAll();

    frmCompanyList _company = new frmCompanyList();
    _company.PerformRefresh();
}

然后是frmCompanyList:

public void PerformRefresh()
{
    __toolCmbStatus.SelectedIndex = 1;
    loadCompany(__toolTxtSearch.Text);
}

 public void loadCompany(string _strSearch)
 {
     try
     {
         ListViewItem Item;
         __lvwCompany.Items.Clear();

        string _strWhereStatement = "(fldCode LIKE '" + "%" + _strSearch + "%" + "' OR fldCompany LIKE '" + "%" + _strSearch + "%" + "' OR fldAddress LIKE '" + "%" + _strSearch + "%" + "' OR fldContactNo LIKE '" + "%" + _strSearch + "%" + "' OR fldContactPerson LIKE '" + "%" + _strSearch + "%" + "')";

        if (__toolCmbStatus.SelectedIndex.ToString() != "2") 
        { _strQry = "SELECT * FROM tblCompany WHERE " + _strWhereStatement + " AND fldActive = '" + __toolCmbStatus.SelectedIndex.ToString() + "' ORDER BY fldCompany ASC"; }
        else
        { _strQry = "SELECT * FROM tblCompany WHERE " + _strWhereStatement + " ORDER BY fldCompany ASC"; }

        using (SQLConnect.SqlCommandEx _SQLCMD = new SQLConnect.SqlCommandEx(_strQry))
        {
            DataTable dt = _SQLCMD.GetDataTable();
            __lblTotalRecord.Text = dt.Rows.Count.ToString();

            if (dt.Rows.Count == 0)
            {
                Item = new ListViewItem("");
                Item.SubItems.Add(Global._strEmptyMsg);
                Item.SubItems[0].ForeColor = System.Drawing.Color.Red;
                __lvwCompany.Items.Add(Item);
            }
            else
            {
                foreach (DataRow DR in dt.Rows)
                {
                    Item = new ListViewItem(DR[0].ToString());
                    Item.SubItems.Add(DR[2].ToString());
                    Item.SubItems.Add(DR[3].ToString());
                    Item.SubItems.Add(DR[4].ToString());
                    Item.SubItems.Add(DR[5].ToString());
                    Item.SubItems.Add(DR[1].ToString());

                    if (DR[6].ToString() == "False")
                    {
                        Item.SubItems.Add("Inactive");
                        Item.SubItems[6].ForeColor = System.Drawing.Color.Red;

                        for (int x = 0; x <= 6; x++)
                        {
                            Item.SubItems[x].Font = new Font(__lvwCompany.Font, FontStyle.Italic);
                        }
                        Item.UseItemStyleForSubItems = false;
                    }
                    else
                    {
                        Item.SubItems.Add("Active");
                        Item.SubItems[6].ForeColor = System.Drawing.Color.Green;
                        Item.UseItemStyleForSubItems = false;
                    }
                    __lvwCompany.Items.Add(Item);
                }
            }
        }
    }
    catch (Exception ex) { MessageBox.Show("Please contact your administrator. Error: " + ex, Global._strTitleMsg); }
}

1 个答案:

答案 0 :(得分:1)

问题出在线上。

frmCompanyList _company = new frmCompanyList();

您实例化表单,调用加载数据的方法,但不实际显示表单。如果您在刷新后致电_company.Show(),则会看到您刷新的列表(但使用其他主表格实例)

您希望以已打开的形式刷新数据,而不是重复。在这种情况下,您必须将frmCompanyList(父窗体)的引用传递给子窗体(frmCompanyEntry)。您可以通过构造函数或某些属性来实现。

在frmCompanyEntry表单中,添加属性

frmCompanyList _company = null;

像这样修改你的frmCompanyEnty构造函数

public frmCompanyEntry(frmCompanyList parent)
{
    this._company = parent;
}

当打开frmCompanyEntry时,从父节点开始,修改如下:

frmCompanyEntry _entry = new frmCompanyEntry(this);
_entry.ShowDialog();

这样您就可以传递对子表单的引用,因此您可以在代码中刷新它。 您现有的代码应该是这样的(注意缺少行frmCompanyList _company = new frmCompanyList()):

DialogResult dialogResult = MessageBox.Show(Global._strInsertAgainMsg + "company?", Global._strTitleMsg, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
    clearAll();
}
else if (dialogResult == DialogResult.No)
{
    this.Close();
    clearAll();

    _company.PerformRefresh();
}