2012-08-08 69 views
0

我正在一個列表視圖中,我試圖在其中添加角色。 我有防止列表視圖具有重複角色的驗證方法。 問題是,當我選擇列表視圖 的另一個列表項時它會拋出相同的消息兩次,並且當我選擇列表視圖的滾動條時,它會拋出相同的消息三次。我認爲 以錯誤的方式使用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將以編輯模式持續存在,直到其名稱被更改或唯一。

+1

你有沒有嘗試通過你的代碼反對運行它..? – MethodMan 2012-08-08 14:53:10

+0

爲什麼這是const布爾nameExists = true;這樣聲明爲什麼不是bool nameExists = true; – MethodMan 2012-08-08 14:55:04

+0

即使我們將const布爾名稱作爲布爾名稱存在也不會影響我的問題。問題是當我從listViewRoles_AfterLabelEdit調用lvi.BeginEdit()時,當我們選擇另一個listview項目時,它會調用listViewRoles_AfterLabelEdit兩次,而當我們選擇listview滾動條時,會調用三次。 – user1370468 2012-08-08 15:43:10

回答

0

你有你的電話在錯誤的事件

使用'AfterLabelEdit'事件。

MSDN AfterLabelEdit

+0

私人無效listViewRoles_AfterLabelEdit(對象發件人,LabelEditEventArgs e讀了) { ListViewItem lvi = listViewRoles.Items [e.Item]; MessageBox.Show(「hello」); lvi.BeginEdit(); } 這裏的MessageBox被調用兩次,當我改變選定的索引,並調用三次當我單擊滾動條...現在如何控制它調用MessageBox一次。 – user1370468 2012-08-08 16:24:59

+0

您可以更新您最初的問題,以顯示代碼,您changed..it會讓我更容易閱讀反對閱讀您的意見 – MethodMan 2012-08-08 16:27:48

+0

另外,我在我的代碼使用AfterLabelEdit作爲 this.listViewRoles.AfterLabelEdit變化+ = new System.Windows.Forms.LabelEditEventHandler(this.listViewRoles_AfterLabelEdit); – user1370468 2012-08-08 16:32:22