2009-05-18 19 views
8

DataTableにバインドする複数選択のリストボックスがあります。 DataTableには、2つの列の説明と値が含まれます。私は、リストボックスのValueMemberでとしてDisplayMemberとして記述し、値を設定していますループなしでListBoxで選択した項目を設定する

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

は、ここでは、コードを移入リストボックスです。値が渡されたかどうかに応じて、ListBoxで選択した項目を設定する必要があります。動作していない

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

は、ここに私のコードです。したがって、私は自分のコード内のエラー/欠けているものを知っていただきたいと思い下記のコード(リストボックス内のすべての項目を通じてどこIループ)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

に頼る必要があります。なぜlb.SelectedValue = valuePassedByUserですか?間違った商品を選ん私はあなたが複数の項目を選択することができます唯一の方法は、foreachループを使用していると思う

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+0

正確に何をする必要があるのか​​、コードのより完全な例についてさらに情報を与えることができますか?オブジェクトがデータベースからフィールドを読み取り、選択したインデックス/値をリストボックス内の一致する値に設定するかどうかを確認します。 – ryanulit

+0

リストボックスには、データベースからデータを取得するDataTableが設定されています。私の懸念は、リストに値を設定しているときにValueMemberを設定した場合、なぜですか? lb.SelectedValue = valuePassedByUser; は機能しませんか? –

答えて

7

Ok ...ここでは、昨日しか気づいていなかった難解な答えが出てきます。私の質問では重要なことは言及していませんでしたが、それは当面の問題とは無関係だと感じたからです。

データテーブルのデータはソートされませんでした。したがって、は、リストボックスのSortedプロパティをtrueに設定しました。後で私は認識リストボックスのまたはコンボボックスのソートされたプロパティがtrueに設定されている場合、値メンバーは正しく設定されません。私が書くのであれば:

lb.SelectedValue = valuePassedByUser;

ではなく、その値valuePassedByUserがあるものをsetttingより選択されたとして、それは他のいくつかの項目を設定します。要するに、それはインデックスを失う。

私の最初のデータが:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

の場合、私はsorted = trueを設定します。そして、リストボックスの項目は、次のとおりです。私が選択したバナナを設定したい場合は

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

は今、私がSTMT実行します。

lb.SelectedValue = "B";

をしかし、その代わりに選択したバナナを設定するの選択として、それはオレンジを設定します。どうして?リストがソートされていないため、バナナのインデックスは4になります。したがって、バナナのソートインデックスを2にしても、インデックス4が選択され、バナナの代わりにオレンジが選択されます。

ソートされたリストボックスのためのしたがって

、私が選択した項目を設定するには、次のコードを使用しています:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

はこれを試してみてください。 SelectedValueプロパティは1個のアイテムしか返していないようです。あなたはもっとして1つのアイテムを選択したい場合は、使用する必要があります:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

またFindStringExactは値フィールドを検索しませんそれだけで表示されるテキストを調べます。また、コードを減らすために、新しい変数をリストボックスにキャストして、Cをリストボックスとしてキャストしないようにすることもできます。

+2

ItemsコレクションにFindByValueはありません。 – norlando

0

あなたはこのように "FindByValue" を使用することができます。

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

は、ここで私が解決方法ですそれは、winformsを使用して、DotNet 4.6

0

選択した項目に対してループを行わない場合は、listBox_SelectedIndexChangedイベントからリストボックスの選択値を取得し、その値をグローバル配列に追加します。次に、その配列にアクセスすることによって、選択したアイテムの値がitemlistであることがわかります。

関連する問題