2015-04-26 6 views
0

В настоящее время я делаю приложение формы окна списка дел как проект. У меня есть программа без работы, но одна вещь, которая в настоящее время не работает, - это функция удаления.Удаление элемента из нескольких массивов

В основном, как моя программа работает в настоящее время, так это то, что я использую любое название задачи, которое они выбирают внутри поля списка, связанные с ним данные (то есть приоритет, дата начала, дата окончания) все находятся с использованием той же позиции индекса , Эта позиция индекса найдена с помощью линейного поиска в массиве заголовков задач, используя заголовок, который пользователь выбирает в списке в качестве ключа.

Я очищаю содержимое этого элемента массива, возвращая его к исходному значению по умолчанию, которое присутствовало в этом элементе перед добавлением данных, например, я сбросил содержимое элемента в массиве заголовка задачи, установив содержимое «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 останется.

Я не уверен, в чем проблема, я чувствовал, что свежие глаза на этот код могут помочь в этой ситуации.

EDIT:

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]; 
    } 
+0

Это должно быть полностью не связанный с вашей проблемой, но вам не нужны эти две строки в функции, я думаю: 'MainForm main = new MainForm(); DataInput input = new DataInput(); ' – DWright

+0

Он * может * помочь увидеть код для' DataArrays' – DWright

+2

Я подозреваю, что на самом деле хотите сделать, это не обнулить элементы массива, а удалить их прямо. В этом случае рассмотрите использование списков вместо массивов, потому что список позволяет удалять элементы из списка. См. [List.RemoveAt()] (https://msdn.microsoft.com/en-us/library/5cw9x18z%28v=vs.110%29.aspx) – DWright

ответ

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

Я подтвердил, что он работает со списками.Предполагая форму Form1, с ListBox ListBox1, следующее дает мне ListBox показывать «оранжевые»:

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; 
    } 
} 
Смежные вопросы