1

我有一个关于在两个 Windows 窗体之间维护列表的问题。这是一个我需要创建通讯录的项目。

我选择以列表的形式维护联系方式。我的第一个 windows 窗体 (form1) 包含一个 list 的主副本AddressBook,其中包含地址簿。我将 4 个条目硬编码到地址簿列表中,以便进行实验并让“添加”和“编辑”等简单功能正常工作。

我有第二个名为 Add 的 Windows 窗体,我可以在其中将新条目添加到列表中。这工作正常。我可以在添加表单中添加一个新联系人,这会显示在初始表单 1 主表单中。

我的问题出现在 EDIT 表单中。我将地址簿(主)列表传递给 EDIT 表单。EDIT 表单采用主列表,我能够操作该列表中的记录。但是,在将新列表发送回母版页 (form1) 时,它不会接收到它。我使用的代码与在成功发回新列表的 ADD 表单中使用的代码相同。但是,此代码在发回已编辑的列表时不起作用。

这是我在 form1 中的 AddressBook 属性

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。列表 temp 现在有已编辑的列表* *

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

Master.AddressBook = temp;

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

Master.AddressBook = temp;当我通过 ADD 表单向列表添加值时,该代码有效。

添加表格:

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

这一切可能措辞很糟糕,但本质上我的代码失败的唯一一点是当我想通过用列表 temp 替换它来更改 form1 中的主地址簿时,它是我的 EDIT 表单中的已编辑列表。

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

4

2 回答 2

2

实现此目的的一种方法是将 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(); 
}

希望这可以帮助。

于 2013-01-16T15:24:16.490 回答
0

这就是Singleton模式派上用场的地方:Implementing Singleton in C#

您会注意到应用程序设置使用相同的模式来允许您全局访问它而无需传递它。

当我使用 a 时,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);

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

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

于 2013-01-16T15:36:59.723 回答