簡體   English   中英

在WinForms c#中動態編輯兩個forms之間的數據

[英]Dynamically edit the data between two forms in WinForms c#

我有兩個 forms。 主窗體是用戶select 項目所在的地方,通過按鈕將它們添加到表單中的列表視圖中。 然后有一個“結帳”按鈕打開第二個表單,用戶可以在其中編輯創建的訂單。 我使用序列化來保存數據,所以當返回之前的表單時,會顯示列表的當前 state。 但是當我嘗試添加新項目時,以前的項目會被替換。 如何在不丟失任何數據的情況下在兩個 forms 之間進行動態通信?

這是我在第一種形式中所擁有的:

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());
            }
        }

你正在做的事情過於復雜。 讓您的兩個 forms 引用一個 ProductsListService class 來管理產品列表(通過適當的方法)。

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

您的主表單 class 可以自己創建此服務,也可以通過任何創建它的方式將其傳遞給它。 然后您可以將此服務傳遞給您的第二種形式:

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

checkoutForm 將只使用此服務,不需要將任何內容傳遞回主表單,因為它們都使用相同的 object。

執行此操作的正確方法是創建在兩個 forms 之間共享的產品列表。 @auburg 的回答涵蓋了一次只能以一種形式進行更改的簡單情況。 這個答案涵蓋了兩個 forms 應該實時同步的情況。

在 WPF 中,這是內置到設計中的。 將您的項目放在 forms 之間共享的ObservableCollection中。 如果產品可以更改,請確保它們實現 INotifyPropertyChanged 並在發生更改時引發事件。 這將確保一種形式的任何更改都反映在另一種形式中。

在 windows forms 這有點麻煩。 一種方法是創建自己的 ObservableCollection,它會在更改時引發事件,以及在列表更新時更新 ListView 或其他 UI 集合的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM