1

.NETの皆さんにとって、これは非常に単純な質問かもしれませんが、私はMFC C ++開発チームから来ているので、この動作はすべて、開発チームに何が起こっているのか疑問に思いました。(MFCでは、ドロップダウンデータソースを作成すると、ソースは共有されますが、各ドロップダウンの値は影響を受けません)

非常に単純な状況です。私のフォームには、通りを尋ねる3つのドロップダウンリストがあります。あなたがいる通りと他の2つの最も近い通り。これらの各ドロップダウンリストには、同じデータソースがあります。つまり、私たちが行ったことは、(ちなみに、ComboListは、いくつかの関数を備えたListItemを継承するクラスにすぎません)

//Combo Street
ComboList cboNomRue = new ComboList();
Tools.GetCombo(cboNomRue, Tools.ComboTypeRt.RT_NOM_RUE, true, true);
ddlNomRue.DisplayMember = "Numero";
ddlNomRue.ValueMember = "ID";
ddlNomRue.DataSource = cboNomRue;

//Combo Street From
ddlDe.DisplayMember = "Numero";
ddlDe.ValueMember = "ID";
ddlDe.DataSource = cboNomRue;

//Combo Street To
ddlA.DisplayMember = "Numero";
ddlA.ValueMember = "ID";
ddlA.DataSource = cboNomRue;

このコードを使用して、ユーザーがddlNomRueの値を変更すると、3つのドロップダウンリストがその値に変更されます。それを修正するために、私はそれをしました。

//Combo Street
ComboList cboNomRue = new ComboList();
Tools.GetCombo(cboNomRue, Tools.ComboTypeRt.RT_NOM_RUE, true, true);
ddlNomRue.DisplayMember = "Numero";
ddlNomRue.ValueMember = "ID";
ddlNomRue.DataSource = cboNomRue;

ComboList cboNomRue2 = new ComboList(cboNomRue);
ComboList cboNomRue3 = new ComboList(cboNomRue);

//Combo Street From
ddlDe.DisplayMember = "Numero";
ddlDe.ValueMember = "ID";
ddlDe.DataSource = cboNomRue2;

//Combo Street To
ddlA.DisplayMember = "Numero";
ddlA.ValueMember = "ID";
ddlA.DataSource = cboNomRue3;

本当に必要なのは1つだけの場合に変数を複製するため、これは好きではありません。これはこの状況に対処するための良い方法ですか、それとも私にできることは他にありますか?

ありがとう

4

2 に答える 2

1

使用しているComboListクラスについてはよくわかりませんが、リストを使用してcomboBoxに表示されるアイテムを格納する場合は、より適切なオプションです。

オブジェクトを何度も作成するため、あなたが採用する方法は良くありません。これを克服するには、Listを使用して、関数AsReadOnly();を呼び出すだけです。

例:

  List<string> Mylist = new List<string>();
            Mylist.Add("salman");
            Mylist.Add("khan");
            Mylist.Add("yousafzai");
            Mylist.Add("ranizai");
            Mylist.Add("kachokhail");




            this.tUsersTableAdapter.Fill(this.dbAIASDataSet.tUsers);
            comboBox1.DataSource = Mylist.AsReadOnly();
            comboBox1.DisplayMember = "ID";
            comboBox1.ValueMember = "ID";


           comboBox2.DataSource = Mylist.AsReadOnly();
           comboBox2.DisplayMember = "ID";
           comboBox2.ValueMember = "ID";

ただし、ComboListのオブジェクトを使用する必要がある場合は、ComboListでicloneableインターフェイスを実装するか、他の方法を使用して浅いコピーを作成します。

于 2012-09-01T10:25:26.287 に答える
0

BindingContextフォームは、データバインディングをサポートするフォーム上のすべてのオブジェクトのデフォルトを自動的に作成します。これBindingContextにより、フォームはそのオブジェクト内のコレクションエントリの数と現在の位置を知ることができます。最初のリストでアイテムを選択すると、その位置が変更され、他の2つのコントロールは同じものにバインドされているためBindingContext、それらもすべて変更されます。この動作を修正するにはBindingContext、次のようにコントロールごとに異なるものを作成するだけです。

ddlNomRue.BindingContext = new BindingContext();
ddlDe.BindingContext = new BindingContext();
ddlA.BindingContext = new BindingContext();

これで、3つのコントロールすべてに同じものをバインドできComboListますが、それでも希望する動作が得られます。

于 2012-09-01T01:25:59.343 に答える