从多个数组中删除元素

时间:2015-04-26 22:38:36

标签: c# winforms

我目前正在制作一个待办事项列表windows表单应用程序作为项目。我有无程序的程序,但目前无效的一件事是删除功能。

基本上我的程序目前的工作方式是我使用他们在列表框中选择的任何任务标题,与之关联的数据(即优先级,开始日期,结束日期)都是通过使用相同的索引位置找到的。通过在任务标题数组中使用线性搜索找到此索引位置,使用用户在列表框中选择的标题作为键。

我通过将数组元素的内容重置为添加数据之前该元素中存在的原始默认值来清除该元素的内容,例如我通过设置内容重置任务标题数组中元素的内容“null”。

然后我使用以下内容刷新列表框内容:

taskListBox.DataSource = null;
taskListBox.DataSource = DataArrays.titleArr;

但是,此方法的完整代码如下所示。

public void deleteSelectedTask(ref ListBox taskListBox)
{
    MainForm main = new MainForm();
    DataInput input = new DataInput();

    string key = Convert.ToString(taskListBox.SelectedValue);

    int i = getTaskKey(key);

    DataArrays.titleArr[i] = null;
    DataArrays.descArr[i] = null;
    DataArrays.priorityArr[i] = 0;
    DataArrays.startDateArr[i] = Convert.ToDateTime("01/01/0001");
    DataArrays.endDateArr[i] = Convert.ToDateTime("01/01/0001");
    DataArrays.completeArr[i] = null;

    taskListBox.DataSource = null;
    taskListBox.DataSource = DataArrays.titleArr;
}

目前这种方法有点工作,技术上确实会删除元素,但是由于某种原因,这会影响数组的数据源,并不总是成功刷新。

例如,假设你有3个任务输入到数组中。您删除元素位置3中的任务,此方法正常工作!该任务已成功从阵列中删除,并且在列表框刷新后不会显示。

但是,如果用户决定删除作为另一个任务的前任任务的任务,即任务1或2,则列表框决定不显示任何连续任务,即使他们尚未被选中删除。例如,如果从列表中删除任务1,则任务2和3也将消失。或者,如果从列表中删除任务2,任务3也将消失,但任务1将保留。

我不确定问题是什么,我觉得对这段代码有一些新的看法可能有助于这种情况。

修改

DataArrays实际上用于存储我的数组:

    public class DataArrays
    {
        public static string[] titleArr = new string[9];
        public static string[] descArr = new string[9];
        public static int[] priorityArr = new int[9];
        public static DateTime[] startDateArr = new DateTime[9];
        public static DateTime[] endDateArr = new DateTime[9];
        public static string[] completeArr = new string[9];
    }

2 个答案:

答案 0 :(得分:5)

您应该使用单个对象列表,而不是将属性存储在单独的数组中。

public class TaskItem
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Priority { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string Complete { get; set; }
}

private List<TaskItem> TaskList = new List<TaskItem>();

public void deleteSelectedTask(ref ListBox taskListBox)
{
    var item = (TaskItem) taskListBox.SelectedItem;
    if (item == null) return;

    TaskList.Remove(item);

    taskListBox.DataSource = null;
    taskListBox.DisplayMember = "Title";
    taskListBox.DataSource = TaskList;
}

答案 1 :(得分:0)

我已经确认它适用于列表。假设表单Form1,列表框ListBox1,下面给我一个ListBox显示&#34; orange&#34;:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        List<String> fruits = new List<String>{ "apple", "orange" };

        this.listBox1.DataSource = fruits.ToArray();
        this.listBox1.DataSource = null;
        fruits.RemoveAt(0);
        this.listBox1.DataSource = fruits.ToArray();
    }
}

以下使用数组而不是列表不起作用:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

       String [] fruits = { "apple", "orange" };

        this.listBox1.DataSource = fruits;
        this.listBox1.DataSource = null;
        fruits[0] = null;
        this.listBox1.DataSource = fruits;
    }
}