web-dev-qa-db-ja.com

リストボックス内のアイテムをプログラムで選択するにはどうすればよいですか?

列挙型のアイテムを表示するリストボックスがあります。リストボックスが表示されたとき/フォームが開いたときに、現在の値(データベースから読み取った値)を選択/強調表示したい。ただし、このコードは次のとおりです。

lblSelectedPrinter.Text = AppSettings.ReadSettingsVal("beltprinter");
listBoxBeltPrinters.SelectedItem = listBoxBeltPrinters.Items.IndexOf(lblSelectedPrinter.Text);

...動作しません。ここで「GetItemAt」を使用した例を見ました( リストボックスでアイテム/インデックスをプログラムで選択 )が、C#の古風なバージョン(.NET 1.1、C#2)にはそのような生き物がありません。

更新

私はこれがうまくいくと思いました:

string currentPrinter = AppSettings.ReadSettingsVal("beltprinter");
lblSelectedPrinter.Text = currentPrinter;
int currentPrinterIndex = listBoxBeltPrinters.Items.IndexOf(currentPrinter);
listBoxBeltPrinters.SelectedItem = currentPrinterIndex;

...ただし、表示されません(現在のプリンタはラベルに表示されますが、リストボックス内の対応するエントリ/値は選択されていません)。

7
B. Clay Shannon

あなたはすでにこれを解決しているようですが、試してテストした方法でやってみませんか?

  lblSelectedPrinter.Text = AppSettings.ReadSettingsVal("beltprinter");
  listBoxBeltPrinters.SelectedIndex = -1;
  if (!String.IsNullOrEmpty(lblSelectedPrinter.Text)) {
    for (int index = 0; index < listBoxBeltPrinters.Items.Count; index++) {
      string item = listBoxBeltPrinters.Items[index].ToString();
      if (lblSelectedPrinter.Text == item) {
        listBoxBeltPrinters.SelectedItem = index;
        break;
      }
    }
  }

このようにして、テキストが変更されるとすぐにSelectedIndex値が-1に設定され、ListBoxで見つかった場合は、そのアイテムが選択されていることがわかります。

さらに良いのは、LabelコントロールlblSelectedPrinterTextChangedイベントを発生させたときにハンドラーを作成することです。

lblSelectedPrinter.TextChanged += new EventHandler(SelectedPrinter_TextChanged);

次に、上記のようにそのイベントハンドラーを作成します。

private void SelectedPrinter_TextChanged(object sender, EventArgs e) {
  listBoxBeltPrinters.SelectedIndex = -1;
  if (!String.IsNullOrEmpty(lblSelectedPrinter.Text)) {
    for (int index = 0; index < listBoxBeltPrinters.Items.Count; index++) {
      string item = listBoxBeltPrinters.Items[index].ToString();
      if (lblSelectedPrinter.Text == item) {
        listBoxBeltPrinters.SelectedItem = index;
        break;
      }
    }
  }
}

あなたはすでにあなたの問題を解決しているので、これは単なる思考の糧です。

7
jp2code

あなたは次を試すことができますか?コードから取得し、FindStringを使用します

string currentPrinter = AppSettings.ReadSettingsVal("beltprinter");
lblSelectedPrinter.Text = currentPrinter;
int index = listBoxBeltPrinters.FindString(lblSelectedPrinter.Text);
listBoxBeltPrinters.SelectedIndex = index;
2
Apollo SOFTWARE

これは機能します:

listBoxBeltPrinters.SetSelected(listBoxBeltPrinters.FindString("beltprinter"), true);
2
Tyler Pantuso

listBoxObject.SetSelected()listBoxObject.FindString()の組み合わせは洗練されたソリューションです。それは私にとってもうまくいきます。

2
coarist
lblSelectedPrinter.Text = AppSettings.ReadSettingsVal("beltprinter");

listBoxBeltPrinters.SelectedItem = listBoxBeltPrinters.Items.FindByText(lblSelectedPrinter.Text);

値による:

listBoxBeltPrinters.SelectedItem = listBoxBeltPrinters.Items.FindByValue(1);
2
spro
int i = AppSettings.ReadSettingsVal("beltprinter"); //Save it as an int.
listBoxBeltPrinters.SelectedItem = listBoxBeltPrinters.Items.IndexOf(i);
lblSelectedPrinter.Text = listBoxBeltPrinters.SelectedItem.toString();
2

整数である必要があります。 int.Parseを使用して変換し、文字列からintにキャストできます。

listBoxBeltPrinters.SelectedItem = listBoxBeltPrinters.Items.IndexOf(int.Parse(System.Configuration.ConfigurationSettings.AppSettings.Get("beltprinter")));
lblSelectedPrinter.Text = listBoxBeltPrinters.SelectedItem.toString();
2
Apollo SOFTWARE

これは機能します:

string currentPrinter = AppSettings.ReadSettingsVal("beltprinter");
lblSelectedPrinter.Text = currentPrinter;
int currentPrinterIndex = listBoxBeltPrinters.Items.IndexOf(currentPrinter);
listBoxBeltPrinters.SelectedIndex = currentPrinterIndex;

これは、設定値を表示、読み取り、および書き込むために必要な唯一のコードです。

private void PrinterPickerForm_Load(object sender, System.EventArgs e)
{
    Type type = typeof(PrintUtils.BeltPrinterType);
    foreach (FieldInfo field in type.GetFields(BindingFlags.Static | BindingFlags.Public))
    {
        string display = field.GetValue(null).ToString();
        listBoxBeltPrinters.Items.Add(display);
    }
    string currentPrinter = AppSettings.ReadSettingsVal("beltprinter");
    lblCurrentPrinter.Text = currentPrinter;
    int currentPrinterIndex = listBoxBeltPrinters.Items.IndexOf(currentPrinter);
    listBoxBeltPrinters.SelectedIndex = currentPrinterIndex;
}

private void btnSaveSelectedVal_Click(object sender, System.EventArgs e)
{
    string sel = listBoxBeltPrinters.SelectedItem.ToString();
    if (sel != lblCurrentPrinter.Text)
    {
        AppSettings.WriteSettingsVal("beltPrinter", sel);
    }
}
2
B. Clay Shannon