7

ユーザーがリストボックスから項目を選択し、関連付けられたオブジェクトの一部を形成するデータを編集する winforms アプリを作成しています。次に、編集内容がオブジェクト リストから基になるファイルに適用されます。

ASP.Net では、ユーザーに表示される表示テキストとは異なるシステム値をリスト項目に割り当てることは簡単です。winforms アプリでは、各項目の "Displaymember" と "Valuemember" をもう少し複雑な (そしてインターネット上ではあまり関係のない) プロセスで設定する必要があります。

これは私がやったことです。デバッグモードでは、すべてのアイテムが表示メンバー (ユーザーに表示される「わかりやすい」文字列) である値と、データが更新されるハッシュテーブルオブジェクトへのキーを保持するキー、値メンバーを持っていることを確認しました。存在します。

したがって、ユーザーが編集する文字列を選択すると、プログラムは「キー」をハッシュテーブルに渡し、オブジェクトをヤンクして、その上で編集できるようにする必要があります。

キャッチ?

アイテムの値メンバーを調べるようにプログラムに指示する明確な方法がわかりません。リスト ボックスの "SelectedValue" プロパティにデータが入力されると単純に予想していましたが、それは単純すぎます。では、リスト アイテムの値を取得するにはどうすればよいのでしょうか。

4

6 に答える 6

6

との両方を使用してもうまくSelectedIndexChangedいきSelectedValueChangedませんでしたListBox's SelectedValue。プロパティは常に null でした。これには私も驚きました。

ListBox不十分な回避策として、オブジェクトを から直接引き出すことができますSelectedIndex

public Form1()
{
    InitializeComponent();

    this.listBox1.DisplayMember = "Name";
    this.listBox1.ValueMember = "ID";

    this.listBox1.Items.Add(new Test(1, "A"));
    this.listBox1.Items.Add(new Test(2, "B"));
    this.listBox1.Items.Add(new Test(3, "C"));
    this.listBox1.Items.Add(new Test(4, "D"));
    this.listBox1.Items.Add(new Test(5, "E"));
}

private void OnSelectedIndexChanged(object sender, EventArgs e)
{
    if(-1 != this.listBox1.SelectedIndex)
    {
        Test t = this.listBox1.Items[this.listBox1.SelectedIndex] as Test;
        if(null != t)
        {
            this.textBox1.Text = t.Name;
        }
    }
}

(と)Testの 2 つのプロパティを持つ単純なクラスです。IDName

もっと良い方法があるはずですが、他に何もなければこれでうまくいくはずです。

于 2009-02-03T15:14:55.100 に答える
5

さて、答えはアンディの答えの結果として来たので、私はその答えに賛成しました。

しかし、小さなクラスを作成してそのクラスにlistitemをキャストしようとすると、プログラムは例外をスローしました。

明らかに例外は、プログラムが私が定義したタイプのクラスにDictionaryEntryをキャストできないことを教えてくれました。

そこで、プロキシクラスを削除し、リクエストを次のように再構成しました。

DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;
string htKey = de.Key.ToString();

そして、それはすべて良いです。

結局のところ、奇妙に単純な答えです。ヒントアンディをありがとう。

于 2009-02-03T16:52:03.203 に答える
3

これが非常に古い投稿であることは承知していますが、リスト ボックスの項目を Dictionary の項目にキャストできませんでした。このソリューションは、Windowsフォーム用の.NET 3.5で機能しました。

KeyValuePair<int, string> kvp = (KeyValuePair<int, string>)listBoxSystems.SelectedItem;
string szValue = kvp.Value;
于 2011-05-19T22:06:25.663 に答える
2

ListBox1_SelectedValueChanged イベント内から「ValueMember」を取得してみてください。

private void ListBox1_SelectedValueChanged(object sender, EventArgs e)
{
    if (ListBox1.SelectedIndex != -1)
    {
        string orbit = ListBox1.SelectedValue.ToString();
    }
}

ArrayList planets = new ArrayList();
planets.Add(new Planet("Mercury", "1"));
planets.Add(new Planet("Venus", "2"));

//Remember to set the Datasource
ListBox1.DataSource = planets;
//Name and Orbit are properties of the 'Planet' class
ListBox1.DisplayMember = "Name";
ListBox1.ValueMember = "Orbit";
于 2009-02-03T14:59:33.227 に答える
0

ListBoxでアイテムの値を取得する方法を探していたときに、ここにたどり着きました。それから、明らかなことが頭に浮かびました。
秘密は、のItemメソッドでC#ありVB、他のメソッドは配列であるため、任意のItemの値を取得するには、次のように記述する必要があります。

//Get value of the #1 Item in the ListBox;
ListBox1.Items[1].toString();

すべてのアイテムを取得してドキュメントまたは文字列に入れるには、次のようにします。

string Value;
for (int c = 0; c < ListBox1.Items.Count; c++)  {
    Value = Value + ListBox1.Items[c].toString();
}

私はあなたたちを助けたと思います。これはあなたの投稿に対する最も簡単な答えです。

于 2009-04-13T23:10:45.053 に答える
0

シンプルでクリーンな方法:

ListBox に項目 (キーと値を含む) を追加します。

lsbListBoxName.Items.Insert(0, New ListItem("Item 1", 1))
lsbListBoxName.Items.Insert(0, New ListItem("Item 2", 2))
...


ユーザー選択でアイテムを取得:

Private Sub lsbListBoxName_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lsbListBoxName.SelectedIndexChanged
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Text)
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Value)
End Sub

これlsbListBoxNameは ListBox の名前で、コードはVB.NETです。このオンライン ツールを使用してC#に変換できます。

于 2015-07-27T12:45:04.680 に答える