我似乎无法弄清楚为什么数据网格视图没有填充。 (此外,跟踪时出现了一个奇怪的错误)

时间:2013-09-10 04:34:18

标签: c# winforms datagridview

我正在尝试从SQLite数据库中提取数据,第一个DGV加载得很好,但第二个没有。调试时,我明白了:

  

- 当前'this.specListing.Current'引发类型'System.IndexOutOfRangeException'对象的异常{System.IndexOutOfRangeException}

this.specListing是一个BindingSource。更具体的错误是“索引-1没有值”,并且有2个项目(计数:2)

代码是:

public frmClassEditor()
{
    //start listing
    InitializeComponent();
    this.clsList = new List<SQLiteDataPair>();
    this.specList = new List<pilotSpec>();

    //create binding sources
    this.clsListing = new BindingSource();
    this.specListing = new BindingSource();

    //updated lags
    this.updatedSpec = true;

    //update listing
    updatePilotListing();
    this.clsListing.DataSource = this.clsList;
    this.specListing.DataSource = this.specList;

    dgvPilotListing.DataSource = this.clsListing;
    dgvPilotSpec.DataSource = this.specListing;

    refreshDGVPilot();
    }

private void refreshDGVSpec()
    {
    this.specListing.ResetBindings(false);
    if (dgvPilotSpec.Columns.Count > 0)
       {
            //do nothing right now
       }
    }

private void updatePilotSpecLst(SQLiteConnection conn, long classID)
{
    this.specList.Clear();
    SQLiteCommand getPilotSpec = conn.CreateCommand();
    getPilotSpec.CommandText = "SELECT * FROM classSpec WHERE classID = " + classID;
    SQLiteDataReader rdr = getPilotSpec.ExecuteReader();
    while (rdr.Read())
    {
       this.specList.Add(new pilotSpec(rdr.GetInt64(0), rdr.GetString(1), txtClassName.Text, rdr.GetInt64(2)));
    }

    refreshDGVSpec();
    }

和pilotSpec非常简单:

public class pilotSpec
{
    public long pilotSpecID;
    public string pilotClassName;
    public string pilotSpecName;
    public long pilotSpecLevel;

    public pilotSpec(long id, string name, string className, long level)
    {
        this.pilotSpecID = id;
        this.pilotClassName = className;
        this.pilotSpecName = name;
        this.pilotSpecLevel = level;
    }
}

我无法理解。

1 个答案:

答案 0 :(得分:1)

您可以将刷新网格方法更新为:

private void refreshDGVSpec()
{
    CurrencyManager currencyManager = (CurrencyManager)this.BindingContext[dgvPilotSpec.DataSource];
    currencyManager.Refresh();
}

编辑:您的班级成员需要拥有公共属性:

更改 public long pilotSpecID; public long PilotSpecID { get; set; }

对所有公共成员变量执行相同的操作。