如何从另一个表单重绘DataGridView

时间:2017-05-23 12:32:09

标签: c# forms winforms datagridview

我有一个包含名称,价格和数量值的项目列表。 此列表以一种形式存储,此表单还有一个编辑按钮,这样当用户点击一行时,他们就可以在弹出的另一个表单中编辑此项目。

我的代码正常工作,以便项目在列表中更改,但是当列表更改时,似乎DataGridView不会更新。 当我编辑项目并添加新行时,它会显示更改的值。

这是我的第一张表格的代码:

private void EditButton_Click(object sender, EventArgs e)
    {
        EditForm editForm = new EditForm();
        if (BasketGrid.RowCount > 0)
        {
            editForm.Show();
        }
    }

所以这个juts设置按钮,以便显示另一个形式。 “BasketGrid”是我的DataGridView,在我的代码开头也给出了一个公共初始化(被称为dgv)

public void EditOkBut_Click(object sender, EventArgs e)
{
    this.newName = editNameBox.Text;
    decimal price;
    int quant;
    if (decimal.TryParse(editPriceBox.Text, out price))
    {
        this.newPrice = price;
    }
    else
    {
        MessageBox.Show("Incorrect format for price");
    }
    if(int.TryParse(editQuantBox.Text, out quant))
    {
        this.newQuantity = quant;
    }
    else
    {
        MessageBox.Show("Incorrect format for quantity");
    }
    foreach (OrderItem o in basketForm.GetList().ToList())
    {
        string listName = basketForm.getListName();
        if (listName == o.ProductName)
        {
            o.ProductName = this.newName;
            o.ProductPrice = this.newPrice;
            o.ProductQuantity = this.newQuantity;
        }
    }
    this.Close();
}

这是我的辅助表格中的“编辑按钮”。这通过方法从我的其他表单中获取我的项目列表,并比较列表中orderitem的产品名称和用户从该行中选择的列表名称。

我创建了'basketForm'作为我的其他形式的新对象,所以我可以访问方法和东西。 我试过使用basketForm.dgv.Refresh();但无济于事。

感谢任何帮助。

干杯, 丹尼尔

2 个答案:

答案 0 :(得分:1)

您可以使用BindingSource和ShowDialog ...

示例:

public partial class MainForm : Form
{
    private BindingSource bindingSource = new BindingSource();

    List<YourData> yourData = new List<YourData>();

    public MainForm()
    {
        InitializeComponent();

        bindingSource.DataSource = yourData;

        dgv.DataSource = bindingSource;
    }
}

更改将反映到您的网格中......

private void EditButton_Click(object sender, EventArgs e)
{
    EditForm editForm = new EditForm(yourData);

    if (BasketGrid.RowCount > 0)
    {
        editForm.ShowDialog(this);

        bindingSource.ResetBindings(true);
    }
}

//Change your Data in EditForm whatever you want
public partial class EditForm : Form
{
    List<YourData> yourData;
    public EditForm(List<YourData> yourData)
    {
        InitializeComponent();
        this.yourData = yourData;
    }
}

答案 1 :(得分:0)

您应该在OrderItem类中实现INotifyPropertyChanged接口。这将仅更新DataGridView中的一个值,而不是更新整个集合,如果集合非常大并且其绑定可能触发操作(如验证等),这可能是至关重要的。

class OrderItem : INotifyPropertyChanged
{
    private string name;
    // other fields : price, quantity

    public string Name
    {
        get { return name; }
        set
        {
            if (value != name)
            {
                name = value;
                NotifyPropertyChanged();
            }
        }
    }
    // other properties: Price, Quantity

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

此外,您必须使用BindingList类而不是List。它支持双向数据绑定机制。