リストボックスからアイテムを削除する必要がある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 内のすべてのアイテムが削除されます。現在/選択されているアイテムのみを削除する必要があります。