0
votes

I am working in a listview where I am trying to add role in it. I have validation method that prevent the listview to have duplicate role. The problem is it throws same message twice when I select another list item of listView and it throws same message thrice when i select the scrollbar of list View. I think the using the listView.BeginEdit() in wrong way. Please ! help me to sort this problem

Code :

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;
}

Edit (from misplaced answer):

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);

When I try the above code it show message box once when i changed the selected index but still when i click the scroll bar, it will called the AfterLabelEdit event so the message called twice. I need a proper solution such that if the added listviewitem is already exists in listview, the added listViewItem persist in edit mode until its name is changed or unique.

1
have you tried stepping thru your code opposed to just running it..? - MethodMan
why is this const bool nameExists = true; declared this way why is it not bool nameExists = true; - MethodMan
even if we make const bool nameExist as bool nameExists doesn't affect my problem. The problem is when I called lvi.BeginEdit() from listViewRoles_AfterLabelEdit it will called listViewRoles_AfterLabelEdit twice when we select anther listview item and thrice when we select the listview scrollbar. - user1370468
I am just wondering if you would ever return false since you can't change the value of a constant.. Problem or not I am seeing a potential problem perhaps you should read up on Constants - MethodMan

1 Answers

0
votes

You have your call in the wrong event

Use the 'AfterLabelEdit' event.

MSDN AfterLabelEdit