0

リストボックスからアイテムを削除する必要があるDeleteキーをクリックするこのコードがあります:

private void listBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (this.listBox1.SelectedIndex >= 0)
                    this.listBox1.Items.RemoveAt(this.listBox1.SelectedIndex);
            }
        }

しかし、削除キーを押すとすぐに、RemoveAt 行でエラーが発生します。

DataSource プロパティが設定されている場合、Items コレクションは変更できません。

今、私は DataSource を使用している Form1 の他の 2 つの場所にあります。

private void ListBoxLoadKeys(Dictionary<string, List<string>> dictionary, string FileName)
        {
            using (StreamReader sr = new StreamReader(FileName))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    int i = line.Count();
                    tokens = line.Split(',');
                    dictionary.Add(tokens[0], tokens.Skip(1).ToList());
                    data.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);
                }
            }
            listBox1.DataSource = data;
        }

二位:

private void ClearListBox()
        {
            data.Clear();
            listBox1.DataSource = null;
            string sb;
            foreach (KeyValuePair<string, List<string>> kvp in LocalyKeyWords)
            {
                for (int i = 0; i < kvp.Value.Count(); i++)
                {
                    sb = "Url: " + kvp.Key + " --- " + "Local KeyWord: " + kvp.Value[i] + Environment.NewLine;
                    data.Add(sb.ToString());
                }
            }
            listBox1.DataSource = data;
            listBox1.Select();
        }

では、DataSource の代わりに、またはそれを保持するために何を使用できますか?

編集:

これを試しました:

private void listBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (this.listBox1.SelectedIndex >= 0)
                {
                    string obj = this.listBox1.SelectedValue.ToString();
                    data.Remove(obj);
                    listBox1.DataSource = null;
                    listBox1.DataSource = data;
                }
            }

        }

しかし、削除キーをクリックすると、ここでエラーが発生します。

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            string url = data[e.Index].Substring(0, 5);

            using (Font f = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular))
            {
                ColorText.ColorListBox(data, e);
            }

        }

文字列 url 行: インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません

編集:

フラグを使用しようとしました:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (deletedKey != true)
            {
                string url = data[e.Index].Substring(0, 5);

                using (Font f = new Font(FontFamily.GenericSansSerif, 8, FontStyle.Regular))
                {
                    ColorText.ColorListBox(data, e);
                }
            }
        }

と:

private void listBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (this.listBox1.SelectedIndex >= 0)
                {
                    deletedKey = true;
                    string obj = this.listBox1.SelectedValue.ToString();
                    data.Remove(obj);
                    listBox1.DataSource = null;
                    listBox1.DataSource = data;
                }
            }

        }

したがって、エラーは発生しませんが、listBox 内のすべてのアイテムが削除されます。現在/選択されているアイテムのみを削除する必要があります。

4

2 に答える 2

2

データ バインディングを使用する場合は、ListBox ではなくデータ ソースから削除します。

private void listBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                if (this.listBox1.SelectedIndex >= 0)
                {
                   string obj = this.listBox1.SelectedValue.ToString();
                   data.Remove(obj);
                   listBox1.DataSource = null;
                   listBox1.DataSource = data;
                }
            }
        }
于 2013-02-24T14:40:55.373 に答える
0

次のように、リストボックスに直接追加できます。

   listbox1.BeginUpdate();
   for (int i = 0; i < kvp.Value.Count(); i++)
                {
                    sb = "Url: " + kvp.Key + " --- " + "Local KeyWord: " + kvp.Value[i] + Environment.NewLine;
                    listbox1.Add(sb.ToString());
                }
   listbox1.EndUpdate();
于 2013-02-24T14:43:57.730 に答える