2012-03-04 20 views
1

我們必須結合一些數據,它看起來像這樣一個GridView如何防止結合期間將一行添加到GridView控件

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

所以:

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

我使用此代碼創建RowNumber考慮到在數據綁定期間,我不想顯示第二行,但我想保留RowNumber。數據應該像這樣顯示:

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

在數據綁定期間如何防止行添加到GridView?

+0

最直接的方法就是不從dbms中選擇它。 – 2012-03-04 12:14:35

+0

是的,但我想如何保持RowNumber.If我不選擇它我的'RowNumber's不正確 – Arian 2012-03-04 12:17:43

回答

4

試試這個:

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

哪裏someCondition是您的支票。

+0

謝謝。它與'RowDataBound'事件一起使用。 – Arian 2012-03-04 12:25:18

+1

不錯!無論如何,從數據源中獲取未使用的行是一種不好的做法,因爲它浪費了性能。 – asktomsk 2012-03-04 12:31:14

+0

Tim Schmelter的解決方案對於可以在SQL層上檢查條件的情況要好得多。 – asktomsk 2012-03-04 16:57:41

1

最好的方法是:不要從DBMS中選擇這一行。

例如(在SQL-服務器> = 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

+0

問題有一個條件 - 保留隱藏行的ID。 – trailmax 2012-03-04 12:31:45

+0

@Trailmax:OP不想保留該ID,但他希望確保RowNumber即使在缺少行的情況下也能正確計算。這是['ROW_NUMBER'](http://msdn.microsoft.com/zh-cn/library/ms186734.aspx)在我的答案中所做的。 – 2012-03-04 12:34:56

+0

啊.. ooops,missunderstood。 – trailmax 2012-03-04 12:38:37

1

OnRowDataBound是你的朋友在這裏

在ASPX文件中,數據網格指定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; 
    }   
} 
0

讓它在數據庫方面

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

我不會去那裏。有時數據庫端腳本無法更改。或者您需要根據用戶操作顯示相同的數據集。此外,它仍然是需要ID的問題。 – trailmax 2012-03-04 12:30:22

0

嘗試這樣,你可以調用使用eval服務器端功能,如果返回true,則使用RowNumbe,否則分配空值,它

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