我正在一個列表視圖中,我試圖在其中添加角色。 我有防止列表視圖具有重複角色的驗證方法。 問題是,當我選擇列表視圖 的另一個列表項時它會拋出相同的消息兩次,並且當我選擇列表視圖的滾動條時,它會拋出相同的消息三次。我認爲 以錯誤的方式使用listView.BeginEdit()。請 !幫我解決這問題顯示相同的消息兩次和三次使用listView
代碼:
private void AddDefaultRoles()
{
ListViewItem lvi = new ListViewItem("Reader");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Writer");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Administrator");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Delete");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Admin");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Contributor");
listViewRoles.Items.Add(lvi);
lvi = new ListViewItem("Designer");
listViewRoles.Items.Add(lvi);
}
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
textBox1.Text = "New Role";
ListViewItem lvi = new ListViewItem(textBox1.Text);
listViewRoles.Items.Add(lvi);
lvi.Selected = true;
lvi.BeginEdit();
}
private void listViewRoles_AfterLabelEdit(object sender, LabelEditEventArgs e)
{
ListViewItem lvi = listViewRoles.Items[e.Item];
string newName = e.Label;
if (newName == null)
newName = lvi.Text;
if (!ValidateRoleName(newName, e.Item))
{
lvi.BeginEdit();
return;
}
}
private void listViewRoles_BeforeLabelEdit(object sender, LabelEditEventArgs e)
{
}
private bool ValidateRoleName(string name, int itemIndex)
{
const bool validName = true;
if ((string.IsNullOrEmpty(name.Trim()))) //empty name
{
MessageBox.Show(this, "empty role name", "Rename failed");
return !validName;
}
if (NameExists(name, itemIndex)) //name already exists
{
MessageBox.Show(this, "already exists", "Rename failed");
return !validName;
}
return validName;
}
private bool NameExists(string newName, int itemIndex)
{
const bool nameExists = true;
for (int i = 0; i < listViewRoles.Items.Count; ++i)
{
if (itemIndex == i)
continue;
if (string.Compare(listViewRoles.Items[i].Text.TrimEnd(), newName.TrimEnd(), true) == 0)
{
return nameExists;
}
}
return !nameExists;
}
編輯(從錯位的答案):
private void listViewRoles_AfterLabelEdit(object sender, LabelEditEventArgs e)
{
ListViewItem lvi = listViewRoles.Items[e.Item];
string newName = e.Label;
if (newName == null)
newName = lvi.Text;
if (_checkRoleName)
{
if (!ValidateRoleName(newName, e.Item))
{
_checkRoleName = false;
lvi.BeginEdit();
return;
}
}
else
{
_checkRoleName = true;
lvi.BeginEdit();
}
}
this.listViewRoles.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listViewRoles_AfterLabelEdit);
this.listViewRoles.BeforeLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listViewRoles_BeforeLabelEdit);
當我嘗試了上面的代碼顯示消息框,有一次,我改變了選擇指數但仍然當我單擊滾動條時,它將調用AfterLabelEdit事件,以便消息調用兩次。我需要一個適當的解決方案,如果添加的listviewitem已經存在於listview中,則添加的listViewItem將以編輯模式持續存在,直到其名稱被更改或唯一。
你有沒有嘗試通過你的代碼反對運行它..? – MethodMan 2012-08-08 14:53:10
爲什麼這是const布爾nameExists = true;這樣聲明爲什麼不是bool nameExists = true; – MethodMan 2012-08-08 14:55:04
即使我們將const布爾名稱作爲布爾名稱存在也不會影響我的問題。問題是當我從listViewRoles_AfterLabelEdit調用lvi.BeginEdit()時,當我們選擇另一個listview項目時,它會調用listViewRoles_AfterLabelEdit兩次,而當我們選擇listview滾動條時,會調用三次。 – user1370468 2012-08-08 15:43:10