【问题标题】:How to solve adding row into datagridview with existing columns?如何解决使用现有列将行添加到 datagridview 的问题?
【发布时间】:2021-03-21 06:57:12
【问题描述】:

我正在使用 linq 查询尝试我的第一个项目。我将新行添加到已经存在的列名的 datagridview 中。

其实是可以的

grid.DataSource = qry.ToList(); 

但由于列HeaderText 的Unicode 字符的某些原因。因此,我将只将每一行放入具有现有列名的 DataGridView。

我需要用本地语言显示HeaderText。但是,我可以根据需要以多种方式更改HeaderText,但根据经验,我认为在 UI 站点中设计HeaderText 对我来说是最好的方式。

下面是我练习过的一些代码。

var qry = (from c in db.TBLCOMPANY 
           where (c.STATUSFLAG == 1) 
           select c).OrderByDescending(c => c.LASTUPDATE);
// grid.DataSource = qry.ToList();

int i = 0;

foreach (MCOMPANY item in qry.ToList())
{
    i = +1;

    DataGridViewRow dr = new DataGridViewRow();

    dr.Cells[0].Value = item.OID.ToString();// Error start from this line
    dr.Cells[1].Value = i.ToString();
    dr.Cells[2].Value = item.COMPANY.ToString();
    dr.Cells[3].Value = item.PROVINCE.ToString();
    dr.Cells[4].Value = item.DISTRICT.ToString();
    dr.Cells[5].Value = item.VILLAGE.ToString();
    dr.Cells[6].Value = item.ESTABLISH.ToString("dd/MM/yyyy");
    dr.Cells[7].Value = item.TEL.ToString();
    dr.Cells[8].Value = item.MOBILE.ToString();
    dr.Cells[9].Value = item.EMAIL.ToString();
    dr.Cells[10].Value = item.ACC1.ToString();
    dr.Cells[11].Value = item.ACC2.ToString();
    dr.Cells[12].Value = item.STATUSFLAG.ToString();
    dr.Cells[13].Value = item.UPDATEBY.ToString();
    dr.Cells[14].Value = item.LASTUPDATE.ToString();

    grid.Rows.Add(dr);
}

这是错误信息

索引超出范围。必须为非负数且小于集合的大小。
参数名称:索引

错误信息的详细信息在这里

System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。

参数名称:索引

在 System.Collections.ArrayList.get_Item(Int32 索引)
在 System.Windows.Forms.DataGridViewCellCollection.get_Item(Int32 索引)

实际上,我仔细检查了 UI 网格中的存在列名是 15,而在编码中我被声明为从 0 到 14。我不知道。

请问,谁能建议如何做到这一点?这是我的第一个 Linq 项目。

提前谢谢你

【问题讨论】:

  • 在您将 DataGridRow 添加到 DataGrid 之前,它与它没有任何关系,因此不知道您有 15 列。另见stackoverflow.com/questions/47497211/…
  • 另外:你的意思可能不是i = +1;,而是i += 1;
  • 谢谢先生,我已经修复了您推荐的错误,但仍然抛出同样的错误。
  • i += 1; DataGridViewRow dr = (DataGridViewRow)grid.Rows[0].Clone();
  • edit您的问题包含新信息,因为在 cmets 中写入时很容易错过。

标签: c# linq


【解决方案1】:

尝试通过获取网格“新”行索引来添加行并将item 属性添加到网格中的该行...类似...

foreach (MCOMPANY item in qry.ToList()) {
  int newRowIndex = grid.Rows.Add();
  grid.Rows[newRowIndex].Cells[0].Value = item.OID.ToString();
  grid.Rows[newRowIndex].Cells[1].Value = i.ToString();
  grid.Rows[newRowIndex].Cells[2].Value = item.COMPANY.ToString();
  grid.Rows[newRowIndex].Cells[3].Value = item.PROVINCE.ToString();
  grid.Rows[newRowIndex].Cells[4].Value = item.DISTRICT.ToString();
  // ....
}

正如在 cmets 中已经指出的那样……您当前代码失败的原因就在这条线上……

DataGridViewRow dr = new DataGridViewRow();

这会创建一个“通用”新DataGridViewRow,但是,它没有列/单元格。因此,当代码尝试在该行的列/单元格 [0] 中设置值时……

dr.Cells[0].Value = item.OID.ToString();

由于明显的原因引发了索引越界异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多