異なるバリューメンバー、同じコントロール
-
05-07-2019 - |
質問
編集1
私の問題は以下に起因していると思いますドロップダウン部分を埋める関数は、Display MemberをCountyNameに設定します。次に、提案されているように、SelectedTextまたはEditValueを設定しようとすると、その関数は、DropDownリストDisplayMemberの何かに一致させようとするCountyIDのみを返します。 ValueMemberリスト内の何かと一致させるために必要です。
次のものを使用して動作するようになりましたが、HACKであり、実際のソリューションを見つけることができれば非常にありがたいです。
lkuResidenceCounty.ItemIndex = Convert.ToInt32(row["ResidencyCountyID"].ToString());
オリジナルポスト
メンバーフォームにルックアップボックス(DevExpress)があり、このコードを使用してDBから可能な値を入力します->
lkuResidenceCounty.Properties.DataSource = ConnectBLL.BLL.Person.CountyList();
lkuResidenceCounty.Properties.PopulateColumns();
lkuResidenceCounty.Properties.DisplayMember = "CountyName";
lkuResidenceCounty.Properties.ValueMember = "CountyID";
lkuResidenceCounty.Properties.Columns[0].Visible = false;
lkuResidenceCounty.Properties.Columns[2].Visible = false;
lkuResidenceCounty.Properties.Columns[3].Visible = false;
CountyNameが期待どおりに表示されるため、これは問題なく機能します。
ただし、以下を使用してこのフィールドの既存のメンバーの値をロードしようとすると、DataSetから行を取得する関数の一部です->
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
空白のボックスが表示されます。コードをステップ実行しましたが、正しいIDがメンバーに返されています。
残念ながら、ドロップダウンオプションを設定するストアドプロシージャは、列" CountyName"を持つメンテナンステーブルから取得します。 & " CountyID"。それは正しいです。残念ながら、特定の人の現在の郡をロードするストアドプロシージャは、「ResidencyCountyID」という列があるPersonテーブルからプルします。 「ResponsibilityCountyID」も存在するため、そのように命名されています。列。
両者が共存する方法が必要なのですが、解決策はありますか?
ありがとう!
解決
DisplayMemberとValueMemberは、選択可能な値のリストをコントロールに入力するために使用されます。読み込まれたLookUpEditコントロールの選択値を設定するには、その EditValue プロパティ:
lkuResidenceCounty.EditValue = row["ResidencyCountyID"].ToString();
編集への応答:ドキュメントによると:
現在選択されている行は、エディターの編集値と表示テキストの値を決定します。 BaseEdit.EditValueの値はRepositoryItemLookUpEditBase.ValueMemberフィールドから取得され、編集ボックスに表示するテキストは選択された行のRepositoryItemLookUpEditBase.DisplayMemberフィールドから取得されます。
BaseEdit.EditValueを変更すると、 エディターは行を見つけて選択します 誰の RepositoryItemLookUpEditBase.ValueMember フィールドには新しい値が含まれます。テキスト 編集ボックスの 新しく選択された行。
これらのコントロールは使用しませんが、説明したとおりに機能してはならないようです。 EditValueはオブジェクトを受け入れるため、ToString()が問題だと思うので、おそらく値にはintが必要です。試してください:
lkuResidenceCounty.EditValue = (int)row["ResidencyCountyID"];
他のヒント
ValueMemberプロパティは、Valueプロパティを設定するときにプルするフィールドをリストに指示します。 ValueMemberを" CountyID"に設定すると、リストがDataboundの場合、すべてのリストアイテムの値プロパティがそれぞれのオブジェクトのCountyIDフィールドに設定されます。
したがって、すべきではありません:
lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
しかし、
lkuResidenceCounty.Properties.ValueMember = "CountyID";
は、データバインドしようとしているフィールドを正しく識別していれば、まったく問題ありませんでした。リストがデータバインドされると、期待する結果が表示されます。
ただし、コードを見てみると、フィールドが一致していないようです。ある場所ではResidencyCountyIDを使用しており、別の場所ではCountyIDを使用しています。それが混乱の原因である可能性が高いです。実際のフィールド名を把握し、ValueMemberを必ず設定してください。
更新
コメントを読んだ後、探しているのはSelectedValueプロパティです。 SelectedValueプロパティは、指定した入力に選択された値を強制するようリストに指示します。
本質的に、ここでは2つのことが行われています。 ValueMemberは、リストにデータソースの値として使用するものを指示し、SelectedValueは現在選択されている値をリストに指示します。
2つの値メンバーを持つために同じLookUpEditが必要なのはなぜですか?スタンドアロンまたはグリッドで使用されていますか?スタンドアロンの場合、現在の行に応じて2つのリポジトリエディターを交換できます。しかし、ValueMemberには2つ以上の可能な値がありますか?それも事態を複雑にします。
更新
編集内容を見ると、何が起こっているかもう少し理解できたと思います。それでは、ValueMember(データ列を参照)を変更するのではなく、エディターの値を変更したいですか?もしそうなら、間違いなくEditValue(SelectedTextではなく、設定するつもりではない)を使用し、次のようにrow [" value_field"]に割り当てる必要があります。
lkuResidenceCounty.EditValue = row["ResidencyCountyID"];
それを行うとどうなりますか?