0

我的表单上有几十个列表框。我希望能够仅使用一个编辑按钮和一个删除按钮从这些列表框中编辑/删除项目。是否应该创建一个循环,这样我就不必为每个列表框编写一个 if 语句?也许是自定义方法?有点迷失在这里。

感谢您的输入。

这是用于编辑的列表框之一的代码:

 private void btnEdit_Click(object sender, EventArgs e)
    {
        //Edit an item in the list box
        //If there are no appointments OR no appointment is selected, inform the user and cancel the operation
        if ((!(appointmentList.Count > 0)) || lstDayView.SelectedIndex == -1)
        {
            MessageBox.Show("Error! You need to select an appointment!");
            return;
        }
        else
        {
            int index = lstDayView.SelectedIndex;
            var myForm = new Form2(appointmentList[index] as Appointment);
            if (myForm.ShowDialog() == DialogResult.OK && myForm.Tag is Appointment)
            {
                Appointment appoint = myForm.Tag as Appointment;
                //lstDayView.Items.RemoveAt(index);
                appointmentList.RemoveAt(index);
                appointmentList.Insert(index, appoint);
                //appoint.toListBox(lstDayView, index);
                this.setCal();
            }
        }

这是用于删除:

 private void btnDeleteApp_Click_1(object sender, EventArgs e)
    {
        if ((!(appointmentList.Count > 0)) || lstDayView.SelectedIndex == -1)
        {
            MessageBox.Show("Error! You need to make and/or select an appointment!");
            return;
        }
        else
        {
            if (MessageBox.Show("Are you sure you wish to delete?", "Confirm Delete", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                appointmentList.RemoveAt(lstDayView.SelectedIndex); //Issue this is removed the index number from the list not the appointmentList
                this.setCal();
            }
        }
4

3 回答 3

0

您正在从List中删除另一个 ListItem ( lstDayView) 。appointmentList

替换这个:

appointmentList.RemoveAt(lstDayView.SelectedIndex);

有以下内容:

appointmentList.RemoveAt(appointmentList.SelectedIndex); 
于 2013-11-11T16:13:48.740 回答
0

正如 ThunderGr 建议的那样,您可以将相同的事件处理程序附加到所有列表框,以便可以应用相同的逻辑。当涉及到迭代时(最初是分配事件处理程序,然后是作为一个整体处理集合),我会将Tag每个控件的属性设置为相关的东西(例如“列表”),然后你可以这样做:

foreach(var control in Controls.Where(c => c.Tag == "List"))
{
    // work with control here (casting to ListBox appropriately).
}

您甚至可以将此作为您的表单的方法,返回IEnumerable<ListBox>如下:

public IEnumerable<ListBox> ListBoxes
{
    get
    {
        return Controls.Where(c => c.Tag == "List").Cast<ListBox>();
    }
}
于 2013-11-11T15:49:18.593 回答
0

您可以在 foreach 循环中使用 Form.Controls 集合来检查和操作列表框。您可以做的另一件事是将相同的 selectedindexchanged 事件分配给您要操作的所有列表框。“sender”参数保存导致事件触发的对象。您可以将其转换为列表框并对其进行操作。

编辑:您的基本问题是您不知道最后选择了哪个列表框。您需要定义一个变量来保留用户输入的最后一个列表框(使用 Enter 事件)并使用该变量从列表框中删除该项目。例子:

ListBox lastEnteredListbox = null;

private void aListboxName_Enter(object sender, EventArgs e)
{
    lastEnteredListbox=(ListBox)sender;
}

private void theButton_Click(object sender, EventArgs e)
{
    if(lastEnteredListbox == null || lastEnteredListbox.SelectedIndex == -1)
    {
          MessageBox.Show("You need to select an Item");
          return;
    }

    lastEnteredListbox.RemoveAt(lastEnteredListbox.SelectedIndex);
}

您需要将要操作的所有列表框的 Enter 事件设置为 aListBoxName_Enter 方法。

如果您只想从所有列表框中删除相同的索引,您只需遍历表单的控件集合并执行if(control is ListBox) ((ListBox)control).RemoveAt(index);

于 2013-11-11T15:44:51.687 回答