【问题标题】:C#, Delete first row from gridview elementC#,从gridview元素中删除第一行
【发布时间】:2016-01-20 17:07:29
【问题描述】:

这个问题被问了很多次,但我似乎找不到直接的答案。

使用 C#,我使用数据表来填充网格视图。我的数据表的第一行包含表标题,所以我循环遍历该行并填充 gridview 标题行。但是现在我需要去掉表格中的第一行(标题行)。我看了一遍,所有消息来源都同意正确的语法是:

   strSQL = "SELECT * FROM [Station ID Request$]";
   OleDbDataAdapter adaBatch = new OleDbDataAdapter(strSQL, strConnExcel);
   DataTable dtBatch = new DataTable();
   adaBatch.Fill(dtBatch);
   gv_stations.DataSource = dtBatch;
   gv_stations.DataBind();
   //  Fill gridview headers with first row of data (spreadsheet headers)
   int i = 0;
   foreach (DataColumn col in dtBatch.Columns)
   {
       gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString();
       i++;
   }
   //  Remove the first line of the gridview (contains header info)
   gv_stations.DeleteRow(0);

除了最后一行,一切正常,这给了我这个错误:

System.Web.HttpException (0x80004005): The GridView 'gv_stations' fired
event RowDeleting which wasn't handled. at
System.Web.UI.WebControls.GridView.OnRowDeleting(GridViewDeleteEventArgs e)
at System.Web.UI.WebControls.GridView.HandleDelete(GridViewRow row, Int32
rowIndex) at System.Web.UI.WebControls.GridView.DeleteRow(Int32 rowIndex) 

我尝试过的每个资源都说最后一行应该没问题。谁能告诉我为什么会出现这个错误?

编辑:这是我的 gridview 对象,根据要求。

<asp:GridView ID="gv_stations" runat="server"
    AutoGenerateColumns="True"    
    CssClass="c_gvv c_gvv_stations_results"
    style="white-space:nowrap;">
</asp:GridView>

【问题讨论】:

  • 为什么添加标题行只是为了删除它?
  • 因为我需要这些信息来填写标题行。
  • 那么你想填充gridview的标题行,这就是你想要实现的全部吗?
  • 不,我需要用数据表的内容填充gridview。数据表的第一行包含标题信息。所以我需要获取所有行,从第一行填写 gridview 标题,然后从表本身中删除该行。

标签: c# asp.net gridview


【解决方案1】:

通过您的 cmets 阅读其他答案后,我对您所说的问题有点困惑。是不是简单的绑定到gridview,数据表中的第一行(headers)既是header行又是gridview的第一行数据?

如果你不想要标题行,你首先检索它,然后通过你的 foreach 循环将它全部添加到然后尝试删除它,这似乎很奇怪。

如果您不希望首先选择标题行,您可以修改连接字符串(大概是 strConnExcel?)以包含“HDR=No”,这将阻止它首先恢复第一行.

但是,如果您想要标题行,请使用“HDR=Yes”并简单地绑定到您的网格视图。它会知道标题行是什么。看看你在做什么,虽然看起来你试图添加标题行然后删除它!?

【讨论】:

  • 我希望数据表的第一行出现在列标题中。然后我需要在表本身中摆脱它。我不明白“HDR=Yes”……那是什么?
  • sr28,你解决了我的问题。我不了解 HDR 属性,但我只是搜索它,是的,那是我的问题。我的大部分代码都是我不理解的解决方法。谢谢。
  • @buckshot - 没问题。有时最好解释总体目标是什么,而不是具体问题。这样人们就可以提出替代您当前方法的建议。
【解决方案2】:

您正试图从GridView 中删除一行,而应该从DataTable 中删除它。使用这一行:

dtBatch.Rows[0].Delete();

而不是这个:

gv_stations.DeleteRow(0);

您也可以简单地循环:

for(int i = 0; i < dtBatch.Columns.Count; i++)
    gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString();

完整代码:

...
//Fill gridview headers with first row of data (spreadsheet headers)
for(int i = 0; i < dtBatch.Columns.Count; i++)
    gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString();

//Remove the first line of the gridview (contains header info)
dtBatch.Rows[0].Delete();

//now do the bindings
gv_stations.DataSource = dtBatch;
gv_stations.DataBind();

【讨论】:

  • Shaharyar,我需要第一行,因为它包含我的网格标题。一旦绑定了gridview,我就会遍历第一行来命名列标题。那时,从数据表中删除该行对我没有帮助。我试图删除第一行,然后重新绑定gridview,但标题都刷新回默认值。感谢您的回复,但这不起作用。
  • 感谢您使用完整代码进行编辑 - 这是我最初的方法,但它也不起作用。填充标题行的循环不适用于尚未绑定的 gridview。我需要先绑定它,然后更新标题。不知道为什么。
【解决方案3】:

您正在将 GridView 绑定到数据源:

gv_stations.DataSource = dtBatch; gv_stations.DataBind();

要么将其从数据源中删除,然后进行数据绑定,要么进行数据绑定并将其从网格视图中删除,而无需重新绑定。

或者如果你想保留它,你可以让它不可见:

gv_stations.rows[0].visible=false

【讨论】:

  • 我必须在设置标题之前绑定它;以及您的建议,“将其从网格视图中删除而不重新绑定。”这就是我想要做的。但是,您关于使该行不可见的建议很有效,非常感谢。
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多