所选行发生更改时,DataGrid获取的索引-1没有值

本文关键字:索引 获取 DataGrid | 更新日期: 2023-09-27 18:20:22

我有一个简单的数据网格,它显示一些List变量的内容。我有两个与它相关的按钮,一个用于向List变量添加内容并刷新数据网格,另一个用于删除它并刷新。

我可以毫无问题地添加对象,但是,如果我更改所选行,我会收到一个错误,说"索引-1没有值。"不知道为什么。

设置数据网格的代码如下:

allTravellersDataGrid.DataSource = 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();
    }

这里有没有人像我一样无助于找出指数问题的原因?

谢谢。

所选行发生更改时,DataGrid获取的索引-1没有值

我怀疑,当您出现此错误时,您当前不在所选项目上。(没有选择项目的列表控件用"-1"表示)。在尝试删除有效项目之前,请先检查该项目,这可能会解决您的问题。

我还使用了BindingList,不确定它会给您带来什么不同。

采用带有名为atteeName的文本框添加名为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;
    }
}
}