[英]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.