编辑列表在两个windows窗体之间(c#)

本文关键字:两个 windows 窗体 之间 列表 编辑 | 更新日期: 2023-09-27 17:53:32

我有一个关于在两个窗体之间维护列表的查询。这是一个项目,我需要创建一个地址簿。

我选择以List的形式维护联系人详细信息。我的第一个windows表单(form1)包含列表AddressBook的主副本,其中包含地址簿。我将4个条目硬编码到地址簿列表中,以便实验并获得简单的功能,如"添加"answers"编辑"工作。

我有第二个窗体称为添加,其中我可以添加新的条目到列表。这很好。我可以在add表单中添加一个新联系人,这将显示在初始的form1,主表单中。

我的问题出现在编辑表单。我将AddressBook(主)列表传递给EDIT表单。EDIT表单接受主列表,我可以操作该列表中的记录。但是,当将新列表发送回母版页(form1)时,它不会接收它。我使用相同的代码,因为我在ADD表单成功地发送回新的列表。但是,当发送回编辑过的列表时,此代码不起作用。

这是我的AddressBook属性在form1

public List<Contact> addressBook;
    public List<Contact> AddressBook
    {
       get { return addressBook;} 
       set {addressBook = value;} 
    }
在编辑

:

public Edit()
    {
        InitializeComponent();           
        temp = Master.AddressBook;    // temp is the temporary List I update within EDIT         
    }

**然后我有我的算法,它成功地让我编辑列表temp. list temp现在有编辑列表**

然后当我点击保存按钮时,我使用以下代码;

Master.AddressBook = temp;

我所需要的是将列表temp发送回form1。

当我通过add表单向列表添加值时,代码Master.AddressBook = temp;工作。

添加表单:

 public Add()
    {
        InitializeComponent();
        temp = Master.AddressBook;

    }

       **** code to add a new record into the list temp. the new record is called newRecord**********

    private void btnAddClose_Click(object sender, EventArgs e)
    {
        stor.AddressBook = temp; // when I hit close on the form, it updates the master     list AddressBook 
        this.Close(); 
    }

这可能是非常糟糕的措辞,但在本质上,我的代码失败的唯一位是当我想改变我的主地址簿内的form1通过替换它与列表temp,这是编辑列表从我的编辑表单。

我认为这和我的AddressBook属性有关。但这并不能解释为什么我可以用包含新记录的列表替换AddressBook,但我不能用包含编辑记录的列表替换它。

编辑列表<T>在两个windows窗体之间(c#)

实现此目的的一种方法是将Master中的列表设置为静态。

主:

    public static List<Contact> AddressBook { get; set; }

注意:你不需要后备变量,如果你确实想使用它,最佳实践建议它是私有的。如果你决定使用它,它也需要是静态的。

在Add表单中,您将收集数据以创建一个新的Contact对象,而temp实际上应该是仅仅是一个Contact对象。添加表单:
private Contact newRecord = null;
public Add()
{
    InitializeComponent();
    newRecord = new Contact();
}
/**** code to add the user-input to the new Contact object ****/
private void btnAddClose_Click(object sender, EventArgs e)
{
    Master.AddressBook.Add(newRecord);
    this.Close(); 
}

这就是Singleton模式派上用场的地方:在c#中实现单例

你会注意到应用程序设置使用相同的模式,允许你全局访问它,而不必传递它。

当我使用Singleton时,我通常使类名称像(TypeName)Manager(例如:AddressBookManager)。

这个类可能是这样的:

public static class AddressBookManager
{
  #region Singleton
  static readonly AddressBookManager instance = new AddressBookManager();
  private AddressBookManager(); // prevent creating instances of this
  public static AddressBookManager Current { get { return instance; } }
  #endregion
  AddressBook master = new AddressBook(); // the master address book
  public AddressBook Master
  { 
    get { return master; }  // get the master address book
    set { master = value; } // set the master address book
  }
}

然后在每个表单中,你可以像这样访问它:

var addressBook = AddressBookManager.Current.Master; 
addressBook.Add(newRecord);

您使用Edit功能遇到的问题可能与您使用临时列表的方式有关。通过使用静态全局列表并在其中添加/编辑项,就不会出现这个问题。由于您的Contact项是class (而不是struct ),它们的更改将自动反映在列表中,因为它们是引用类型。

关于Singleton类的伟大部分是能够从项目中的任何地方访问它们。唯一需要注意的是,在使用多线程应用程序和Singleton类时需要格外小心。