2009-05-04 30 views
1

DataTableを使用してXMLファイルからComboBoxに項目を入力しています。現在、私は1つの列がComboBoxのdisplaymemberであり、別の列がvalueメンバーであるように設定しています。しかし、私はselectedItemパラメータを設定しなければならないので、これは常に私にとってはうまくいかないかもしれませんし、valueメンバは一意ではないかもしれません。ComboBoxの値メンバーとしてDataRowを設定します。

値のメンバーがテーブルに重複しているかどうかわからないので、私の考えは、ComboBoxの値メンバとしてDataRow全体を配置し、ComboBox.SelectedITem =(DataRow )some_data_row;選択すると、常に正しいComboBoxオブジェクトが選択されます。

これはどのようにして達成できますか?これを行うには良い方法がありますか?私は提案には触れていますが、メンバーと値のメンバーを表示することができます。

ありがとうございました!

EDIT:たぶん私は、これはここに最善のアプローチであれば、私もがこれを行う方法をを求めています求めていますしかし一方で、前に十分に明確ではありませんでした。値のメンバパラメータを設定しない場合、SelectedItemはDataRowView型です... selectedValueパラメータを使用してComboBoxからアイテムを選択し、値メンバを明示的に設定せずにそれを実行しようとした場合、例外がスローされます。あなたはDataTableListBoxをバインドする場合

答えて

0

まず、アダムロビンソンに感謝します。あなたの答えは正しいと確信していますが、私が聞きたかったものではありませんでした。私は別の方法で私の問題を解決し、私はそれが他の人にとって役に立つかもしれないと思うので、私はここにそれを掲示しています。

私は新しいクラスを作成しましたが、私のケースでは、DataRowというプロパティを持つListObjectという名前を付けました(後ほど見てきますが、これは他の型でも機能します。私のItem valueプロパティとして欲しい)。

  • ブールは(オブジェクトobj)
  • のint GetHashCodeメソッドは()私の場合には必要ない--is、しかし、Visual Studioの
    はそれがあるべき警告を出し等しい

    • 文字列のToString():それはまた、メソッドをオーバーライドしますオーバーライドされます。

    ComboBox.Itemsコレクションを自分のクラスのオブジェクトで塗りつぶしてカスタム文字列を表示できるというアイデアがありました(このようにしていないと、スタックオーバーフローに関する私の次の質問はおそらくカスタマイズに関するものですDataRowから項目を読み込むときにDisplayMembersを使用)、(私の場合はDataRowで)1つのクラスの項目だけを比較します。

    ここにコードがあり、それは(少なくとも私がそれをやりたいと思っていたものに対して)すごく効果的です。私の場合は

    public class ListObject 
    { 
        public DataRow element; 
    
        public String DisplayObject = null; 
    
        public ListObject(DataRow dr) 
        { 
         element = dr; 
        } 
    
        public ListObject(DataRow dr, String dspObject) 
        { 
         element = dr; 
         DisplayObject = dspObject; 
        } 
    
        public override String ToString() 
        { 
         if (DisplayObject == null) throw new Exception("DisplayObject property was not set."); 
    
         return element[DisplayObject].ToString(); 
        } 
    
        public override bool Equals(object obj) 
        { 
         if (obj.GetType() == typeof(ListObject)) 
          return Equals(((ListObject)obj).element, this.element); 
         else return base.Equals(obj); 
        } 
    
        public override int GetHashCode() 
        { 
         return base.GetHashCode(); 
        } 
    } 
    

    私はコンボボックスのforeach文とを埋めることができるので、それは素晴らしい作品:

    dtUsers.ReadXml(Program.Settings.xmlInputUsers); 
    
    foreach(DataRow dr in dtUsers.Rows) 
    { 
        cmbUser.Items.Add(new ListObject(dr, "Name")); 
    } 
    

    そして、私が欲しいのDataRowは、私はちょうどこれを行うIを選択します:

    cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow); 
    

    ここで私はDisplayMemberなどについて心配する必要はありません。DataRowだけが比較され、ComboBox.Itemsコレクションを埋めたときから表示パラメータが設定されるからです。また、toStringメソッドはオーバーライドされているので、実際に出力をカスタマイズすることができます。

    このクラスの作成は、のComboBox.SelectedItemプロパティのmsdn記事のためにのみ可能で、SelectedItemプロパティはIndexOfメソッドを使用して動作します。このメソッドはEqualsメソッドを使用して等価性を判定します。

  • 1

    、あなたが実際に(DataTableIListSourceを実装し、それがDataViewを返す)DataTableことを表しDataViewにそれを結合しています。 SelectedItemを直接DataRowインスタンスに設定することはできません。DataRowViewインスタンスに設定する必要があります。残念ながら、DataRowからDataRowViewを入手する簡単な方法はありません。

    DataRowViewですべてのやりとりをするのがよいでしょう。これにより、明示的にSelectedItemを設定することができます。

    SelectedValueプロパティは使用できません。SelectedItemを使用する必要があります。

    0

    これは、コンボボックス

    private void load() { 
    DataTable dt = // get data from DB 
    comboBox1.ValueMember = null; // allows you to get all fields in the obj to combobox 
    comboBox1.DisplayMember = "ccType";//label displayed from dt 
    comboBox1.DataSource = dt; 
    } 
    //to test 
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
        { 
    
         DataRowView current = (DataRowView)comboBox1.SelectedValue; 
         string drs = current.Row["ID"].ToString(); 
    
        } 
    
    にDataTableを取得するための最も簡単な方法です
    関連する問題