DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インスタンスの扱い方

環境/言語:[vs2005 C#]
分類:[.NET]


お世話になってます。
テキストボックスを拡張するコンポーネントを作ってまして
フォームのロード時にフォームに貼ったコンポーネントのDataListに
それぞれ値を入れたのですけど全部最後にセットした値になってしまいます。
それぞれNewしているので大丈夫だと・・・
インスタンスの扱い方がおかしいと思いますがどうすればよいのでしょうか?



//----------------フォーム側

private void Form1_Load(object sender, EventArgs e)
{
Dictionary<string, string> dataList =
        new Dictionary<string, string>();

dataList.Clear();
dataList.Add("1", "a");
dataList.Add("2", "b");
TextBoxEx.DataList = dataList;

dataList.Clear();
dataList.Add("1", "A");
dataList.Add("2", "B");
TextBoxEx.DataList = dataList;

}

//----------------コンポーネント側


namespace aaa
{
public partial class TextBoxEx : TextBox
{
private Dictionary<string, string> dataList =
        new Dictionary<string, string>();

public Dictionary<string, string> DataList
{
set { dataList = value; }
get { return dataList; }
}

protected override void OnKeyDown(KeyEventArgs e)
{
      //ここでどっちもA,Bが表示されます。
foreach (KeyValuePair<string, string> list in dataList)
{
Console.WriteLine("{0}:{1}", list.Key, list.Value);
}
base.OnKeyDown(e);
}

}
}
2007/08/08(Wed) 13:00:25 編集(投稿者)

それぞれの TextBoxEx で Dictionary を new していますが、Form 側で Dictionary を上書き(代入)してますよね。
これにより、全ての TextBoxEx が同じ Dictionary のインスタンスを参照しているのでしょう。

それぞれの TextBoxEx の DataList プロパティに直接 Add してやるのが良いと思います。

※ 個人的には Dictionary を返すプロパティには set を宣言しません。用途によりますが。

# 変な場所にスペースが入っていたので編集。
> Dictionary<string, string> dataList =
>         new Dictionary<string, string>();
>
> dataList.Clear();
> dataList.Add("1", "a");
> dataList.Add("2", "b");
> TextBoxEx.DataList = dataList;
>
> dataList.Clear();
> dataList.Add("1", "A");
> dataList.Add("2", "B");
> TextBoxEx.DataList = dataList;

Dictionaryをバケツとします。
バケツは一つしかありません。
dataListにはバケツの置いてある場所が書かれています。(参照型)
Clearメソッドはバケツの中身を空っぽにします。
二つある「 = dataList;」が何をあらわしてるかを考えてみてください。
お返事ありがとうございます。
ちょっとコード間違ってました。

TextBoxEx1.DataList = dataList; <--- ちがうコントロール

TextBoxEx2.DataList = dataList; <---ちがうコントロール

直接AddすればOKですがなぜ上書きされるのかわかりません。
dataListリストは使いまわしですが
TextBoxEx1とTextBoxEx2のDataListは別ものでは?
気づいて追記してたらフォローが。

まどかさん、ありがとうございます。
すいませんでした。
更に投稿タイミングが被った… orz

TextBoxEx1 と TextBoxEx2 の別のコントロールに、Dictionary の『同じ』インスタンスを渡してますから。
新たに別のインスタンスを生成してから代入すれば、希望通りの動きになるでしょう。この方法はオススメしませんが。

TextBoxEx1 と TextBoxEx2 は別物ですが、dataList 変数は同じモノです。
代入先で別のモノが作られているわけではありませんので、代入後に中身を変更すれば TextBoxEx1 の持っているモノも変わります。(というか同じモノですので)
参照型なので途中で値を変えると参照してるところ全部の値も
変わってしまうのですね。
※慣れないとこれからも間違えそう(T-T
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板