【问题标题】:How to prevent a row add to GridView during binding如何防止在绑定期间将行添加到 GridView
【发布时间】:2012-03-04 12:11:18
【问题描述】:

我们有一个绑定到一些数据的GridView,它看起来像这样:

RowNumber        Id                   Desc
-------------------------------------------
   1                20                  Desc1   
   2                30                  Desc2   
   3                40                  Desc3   
   4                50                  Desc4   

我使用此代码创建RowNumber

<asp:TemplateField HeaderText="">
    <ItemTemplate>
        <asp:Label ID="lblSlNo" runat="server" Text='<% #Container.DataItemIndex + 1 %>' />
    </ItemTemplate>
    <HeaderStyle HorizontalAlign="Center" />
    <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

所以考虑到在数据绑定期间,我不想显示第二行,但我想保留 RowNumber。数据应如下所示:

RowNumber        Id                   Desc
-------------------------------------------
   1                20                  Desc1   
   3                40                  Desc3   
   4                50                  Desc4   

如何防止在数据绑定期间向 GridView 添加行?

【问题讨论】:

  • 最直接的方法就是不要从你的 dbms 中选择它。
  • 是的,但是我想如何保留 RowNumber。如果我不选择它,我的 RowNumbers 不正确

标签: c# asp.net c#-4.0 gridview


【解决方案1】:

试试这个:

void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (row.RowType == DataControlRowType.DataRow){
        e.Row.Visible = SomeCondition;
    }
}

someCondition 是您的检查对象。

【讨论】:

  • 不错!无论如何,从数据源中获取未使用的行是一种不好的做法,因为它会浪费性能。
  • Tim Schmelter 的解决方案对于可以在 SQL 层检查您的条件的情况要好得多。
【解决方案2】:

最好的办法是:不要从 DBMS 中选择这一行。

例如(在 SQL-Server >=2005 中):

WITH cte AS(
    SELECT Id                   
           ,Desc
           ,ROW_NUMBER()OVER(Order By ID)As RowNumber
    FROM Table
)
SELECT * FROM cte
where RowNumber != 2
ORDER BY RowNumber 

http://msdn.microsoft.com/en-us/library/ms186734.aspx

【讨论】:

  • 问题有一个条件 - 保留该隐藏行的 ID。
  • @Trailmax:OP 不想保留 ID,但他想确保即使缺少行也能正确计算 RowNumber。这就是ROW_NUMBER 在我的回答中所做的。
【解决方案3】:

OnRowDataBound是你的朋友

在 ASPX 文件中,为 datagrid 指定 OnRowDataBound 事件

<GridView ID="ResultsGridView" runat="server"   onRowDataBound="ResultsGridView_RowDataBound">

然后进入CS文件:

protected void ResultsGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.Cells[1].value)//check your value here
    {
        e.Row.Visible = false;
    }        
}

【讨论】:

    【解决方案4】:

    在数据库端制作它

    select * from 
    (
    select Row_Number() over(order by ID) RowNumber,        Id,   Desc
    ) a
    where RowNumber<>2
    

    【讨论】:

    • 我不会去那里。有时 DB 端脚本无法更改。或者您需要根据用户操作显示相同的数据集。此外,仍然需要 ID 是问题中的一个条件。
    【解决方案5】:

    这样试试,你可以使用Eval调用服务端函数,如果返回true,则使用RowNumbe,否则给它赋值为空

    <asp:Label ID="lblSlNo" runat="server" Text='<%# ((Eval("yourColumn") ==SomeCondition ? (Eval(Container.DataItemIndex + 1) : Eval("")) %>'></asp:Label>
    

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 1970-01-01
      • 2013-12-26
      • 2014-09-12
      • 1970-01-01
      • 2012-05-08
      • 2018-06-30
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多