编辑列表在两个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,但我不能用包含编辑记录的列表替换它。
实现此目的的一种方法是将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
类时需要格外小心。