我有一个包含名称,价格和数量值的项目列表。 此列表以一种形式存储,此表单还有一个编辑按钮,这样当用户点击一行时,他们就可以在弹出的另一个表单中编辑此项目。
我的代码正常工作,以便项目在列表中更改,但是当列表更改时,似乎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();但无济于事。
感谢任何帮助。
干杯, 丹尼尔
答案 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
。它支持双向数据绑定机制。