DataGrid получает Index -1, не имеет значения при изменении выбранной строки - PullRequest
1 голос
/ 14 января 2012

У меня есть простая таблица данных, которая отображает содержимое некоторой переменной List. С ней связаны две кнопки: одна для добавления содержимого в переменную List и обновления сетки данных, другая для удаления и обновления.

Я могу добавить объекты без проблем, однако, если я изменяю выбранную строку, я получаю сообщение об ошибке «Индекс -1 не имеет значения». Понятия не имею почему.

Код для настройки сетки данных выглядит следующим образом:

allTravellersDataGrid.DataSource = allTravellers;

где allTravellers - это список, о котором я говорил выше.

Кнопка для добавления контента в список allTravellers выглядит следующим образом:

private void addAttendee_Click(object sender, EventArgs e)
    {
        if (attendeeName.Text == "" || attendeeSurname.Text == "" || attendeeBirthDate.Text == "" || attendeeIdNumber.Text == "")
        { MessageBox.Show("Not all information regarding the attendee entered"); }
        else
        {
            allTravellers.Add(dt.prepareTraveller(attendeeName.Text, attendeeSurname.Text, attendeeBirthDate.Text, attendeeIdNumber.Text));
            allTravellersDataGrid.DataSource = null;
            allTravellersDataGrid.DataSource = allTravellers;
            allTravellersDataGrid.Refresh();
        }
    }

и наконец код кнопки для удаления объектов из списка выглядит так:

private void removeAttendee_Click(object sender, EventArgs e)
    {
        traveller travellerToRemove = (traveller)allTravellersDataGrid.CurrentRow.DataBoundItem;
        allTravellers.Remove(travellerToRemove);
        allTravellersDataGrid.Refresh();
    }

Есть здесь кто-нибудь, кто не так беспомощен, как я, чтобы выяснить, что является причиной проблемы с индексом?

Спасибо.

1 Ответ

0 голосов
/ 14 января 2012

Я подозреваю, что когда вы получаете эту ошибку, вы в настоящее время не на выбранном элементе. (Элементы управления списком, у которых не выбран элемент, указывают это с '-1'). Проверка действительного элемента перед его удалением, вероятно, решит вашу проблему.

Я также использовал BindingList, не уверен, какая разница для вас.

примите форму с текстовое поле имени кнопка добавления с именем addBtn кнопка удаления с именем removeBtn сетка с именем allTravellersDataGrid

Это работает:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using StackOverFlowWinForms.Model;

namespace StackOverFlowWinForms
{
public partial class Form1 : Form
{
    private BindingList<Traveller> _allTravellers = new BindingList<Traveller>();
    public BindingList<Traveller> allTravellers { get { return _allTravellers; } }

    public Form1()
    {
        InitializeComponent();

        allTravellers.Add(new Traveller("Fred"));
        allTravellers.Add(new Traveller("George"));
        allTravellers.Add(new Traveller("Sam"));
        allTravellers.Add(new Traveller("Mary"));

        this.allTravellersDataGrid.DataSource = allTravellers;

    }

    private void addBtn_Click(object sender, EventArgs e)
    {
        if (attendeeName.Text == "")
        { MessageBox.Show("Not all information regarding the attendee entered"); }
        else
        {
            allTravellers.Add(new Traveller(attendeeName.Text));
        }

    }

    private void removeBtn_Click(object sender, EventArgs e)
    {
        if (allTravellersDataGrid.CurrentRow != null) 
        {
            Traveller travellerToRemove = (Traveller)allTravellersDataGrid.CurrentRow.DataBoundItem;
            allTravellers.Remove(travellerToRemove);

        }

    }
}
}

using System;
using System.ComponentModel;

namespace StackOverFlowWinForms.Model
{
public class Traveller 

{

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    #endregion 

    private string _attendeeName;
    public string attendeeName 
    { 
        get 
        {
            return _attendeeName; 
        } 
        set 
        {
            _attendeeName = value; 
            NotifyPropertyChanged("attendeeName"); 
        } 
    }


    public Traveller()
    {
        this.attendeeName = "Unknown";
    }
    public Traveller(string name)
    {
        this.attendeeName = name;
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...