【问题标题】:Dynamically edit the data between two forms in WinForms c#在WinForms c#中动态编辑两个表单之间的数据
【发布时间】:2020-06-09 10:29:54
【问题描述】:

我有两种形式。主表单是用户通过按钮选择项目并将它们添加到表单中的列表视图的地方。然后有一个“结帐”按钮打开第二个表单,用户可以在其中编辑创建的订单。我使用序列化来保存数据,所以当返回之前的表单时,会显示列表的当前状态。但是当我尝试添加新项目时,以前的项目会被替换。 如何在不丢失任何数据的情况下在两个表单之间进行动态通信?

这是我的第一种形式:

private void buttonCheckOut_Click(object sender, EventArgs e)
        {
            var binFormatter = new BinaryFormatter();
            using (var fileStream = new FileStream(@"D:\productsList.txt", 
                FileMode.Create, FileAccess.Write))
                binFormatter.Serialize(fileStream, productsList);
CheckOutForm checkOut = new CheckOutForm(TotalBill.Text, productsList, false);
            this.Hide();
            checkOut.ShowDialog();
}

而第二种形式的反序列化是这样的:

        Form1 f = new Form1(null);


        var binFormatter = new BinaryFormatter();
        using (var fileStream = new FileStream(@"D:\productsList.txt",
           FileMode.Open, FileAccess.Read))
        {
            productsList1 = (List<Product>)binFormatter.Deserialize(fileStream);
            foreach (var pr in productsList1)
            {
                    f.listView1.Items.Add(pr.ToString());
            }
        }

【问题讨论】:

    标签: c# winforms serialization


    【解决方案1】:

    您正在做的事情过于复杂。让您的两个表单都引用管理产品列表的 ProductsListService 类(通过适当的方法)。

    public class ProductsListService
    {
      List<Product> GetProducts();
      void AddProduct(Product product);
      ...
    }
    

    您的主窗体类可以自己创建此服务,也可以通过创建它的任何对象将其传递给它。然后您可以将此服务传递给您的第二种形式:

    CheckOutForm checkOut = new CheckOutForm(TotalBill.Text, productsListService, false);
                this.Hide();
    

    checkoutForm 将只使用此服务,不需要将任何内容传递回主表单,因为它们都使用相同的对象。

    【讨论】:

      【解决方案2】:

      执行此操作的正确方法是创建在两个表单之间共享的产品列表。 @auburg 的回答涵盖了一次只能以一种形式进行更改的简单情况。这个答案涵盖了两个表单应该实时同步的情况。

      在 WPF 中,这是内置在设计中的。将您的项目放在表单之间共享的ObservableCollection 中。如果产品可以更改,请确保它们实现 INotifyPropertyChanged 并在发生更改时引发事件。这将确保一种形式的任何更改都反映在另一种形式中。

      在 windows 窗体中,这有点麻烦。一种方法是创建您自己的 ObservableCollection,它会在更改时引发事件,以及在列表更新时更新 ListView 或其他 UI 集合的方法。

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        相关资源
        最近更新 更多