1

2 つのウィンドウ フォーム間でリストを維持することに関して質問があります。アドレス帳を作成する必要があるプロジェクト用です。

連絡先の詳細をリストの形式で維持することにしました。私の最初の Windows フォーム (form1) にAddressBookは、アドレス帳を含む list のマスター コピーが含まれています。「追加」や「編集」などの単純な機能を実験して動作させるために、アドレス帳リストに 4 つのエントリをハードコーディングしました。

Add という 2 番目の Windows フォームがあり、新しいエントリをリストに追加できます。これはうまくいきます。ADD フォームに新しい連絡先を追加すると、最初のフォーム 1 のマスター フォームに表示されます。

私の問題は EDIT フォームで発生します。AddressBook (マスター) リストを 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         

    }

**その後、リストの一時を正常に編集できるアルゴリズムを取得しました。リスト一時に編集済みリストが含まれるようになりました* *

次に、保存ボタンを押すと、次のコードを使用します。

Master.AddressBook = 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(); 
    }

これはおそらく非常に言葉遣いが悪いですが、本質的にコードが失敗する唯一のビットは、form1 内のマスター Addressbook を、EDIT フォームから編集されたリストであるリスト temp に置き換えることによって変更したい場合です。

私の AddressBook プロパティと関係があると思います。しかし、なぜ AddressBook を新しいレコードを含むリストに置き換えることができるのに、編集されたレコードを含むリストに置き換えることができないのか、これでは説明できません。

4

2 に答える 2

2

これを実現する1つの方法は、マスターのリストを静的にすることです。

マスター:

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

注:バッキング変数は必要ありません。使用する場合は、ベストプラクティスでプライベートにすることをお勧めします。使用する場合は、静的である必要もあります。

次に、[追加]フォームでデータを収集して、新しい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パターンが役に立ちます: C# でシングルトンを実装する

Application Settingsがこの同じパターンを使用して、それを渡すことなくグローバルにアクセスできることに気付くでしょう。

を使用するときは、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( notstruct ) であるため、参照タイプであるため、変更は自動的にリストに反映されます。

クラスの優れた点Singletonは、プロジェクトのどこからでもアクセスできることです。Singleton唯一の注意点は、マルチスレッドのアプリケーションやクラスを扱うときは特に注意する必要があるということです。

于 2013-01-16T15:36:59.723 に答える