отмена выбора значения listbox

#c# #listbox

#c# #listbox

Вопрос:

Я выбираю элементы из одного ListBox и добавляю их ко второму ListBox при нажатии кнопки. Проблема в том, что когда я хочу отменить выбор выбранных элементов из listbox2, он выдает ошибку «Ссылка на объект не установлена для экземпляра объекта». Ниже приведен код, который я добавил за кнопкой ВЫБОРА. Я использовал тот же код для отмены выбора, заменив listbox1 на listbox2 и наоборот.

ПРИМЕЧАНИЕ: элементы в listbbox1 извлекаются из базы данных, а элементы, выбранные в listbox2, будут сохранены в базе данных

 List<int> rowIndexes = new List<int>();

foreach (int index in listBox1.SelectedIndices)
{
    DataRowView view = listBox1.Items[index] as DataRowView;
    string id = view["Course_Id"].ToString();
    string name = view["Course_Name"].ToString();
    listBox2.Items.Add(name);
    rowIndexes.Add(index);
}

try
{
    for (int i = rowIndexes.Count; i > 0; i--)
    {
        dt.Rows.RemoveAt(rowIndexes[i - 1]);
        dt.AcceptChanges();
    }
}

catch (Exception er)
{
    MessageBox.Show(er.Message);
}
  

Комментарии:

1. C #? в какой строке вы получаете ошибку? Это точно скопировано?

2. Список<int> Индексы строк = новый список<int>(); содержит null .

3. Ошибка в строке List<int> rowIndexes = new List<int>(); ? Это не имеет никакого смысла — все, что вы делаете, это создаете новое (пустое) List<T> .

4. прошу прощения… ошибка находится в DataRowView view = listBox1 . Элементы [индекс] как DataRowView; после вставки последовательных точек останова во всех этих элементах я обнаружил, что даже после выполнения приведенной выше строки переменная view все еще содержит null. и в следующей строке я присваиваю значение view идентификатору .. Как это может быть разрешено?

Ответ №1:

В лучшем случае это предположение, потому что утверждение о том, что оно завершается ошибкой в первой строке, не имеет смысла.

Мои экстрасенсорные способности говорят мне, что это на самом деле не удается

 string id = view["Course_Id"].ToString();
  

поскольку view имеет значение null. Проблема в том, что

 DataRowView view = listBox1.Items[index] as DataRowView;
  

пытается преобразовать элементы из ListBox в DataRowView. Это всегда будет возвращать значение null, если только по какой-либо (нечетной) причине вы не заполнили свой ListBox.Элементы с коллекцией DataRowView.

Редактировать

Возможно, вы заполняете listBox1 с помощью DataRowView, но вы заполняете listBox2 с помощью System .Строка:

 string name = view["Course_Name"].ToString();
listBox2.Items.Add(name);
  

Попробуйте изменить это на

 //string id = view["Course_Id"].ToString();
//string name = view["Course_Name"].ToString();
listBox2.Items.Add(view);
  

Комментарии:

1. да, вы правы, проблема в представлении. но он отлично работает при перемещении элементов из listbox1 в listbox2, тогда y выдает ошибку при перемещении элементов из listbox2 в listbox1?

2. я попытался закомментировать эти две строки и написать listBox2.Items. Добавить (просмотр); но это выдает ошибку, что коллекции элементов не могут быть изменены, когда установлено свойство datasource???? любая помощь, пожалуйста???

3. Я полагаю, что ошибка связана с копированием обратно в исходное ListBox, которое было загружено с помощью привязки данных. Похоже, вам нужно будет изменить представление данных за ListBox.DataSource, а не напрямую изменять ListBox. Элементы для этого направления.

Ответ №2:

Предполагая, что это скопировано точно из вашего кода. Эта строка неверна:

 List<int> row Indexes = new List<int>();
  

его должно быть:

 List<int> rowIndexes = new List<int>();
  

Кроме того, что такое dt ?

Редактировать

Если это действительно сбой при:

 List<int> rowIndexes = new List<int>();
  

Возможно, вы не:

 using System.Collections.Generic;
  

Или иметь ссылку на System в ссылках на ваш проект.

Комментарии:

1. Основываясь на вызываемых методах dt и имени переменной, это, вероятно, a DataTable 🙂 Независимо от того, находится ли оно в области видимости на данный момент, не очевидно, исходя из опубликованного кода OP.

2. dt — это таблица данных, используемая для извлечения значений из базы данных.

3. в моем коде есть rowIndexes, я не понимаю, как здесь отображаются индексы строк.

4. У вас есть ссылка на проект System и вы «используете System. Коллекции. Общий» в вашем файле кода?

5. да, я использую общее пространство имен… есть идеи, в чем может быть проблема?