2012-09-12 89 views
0

我使用DetailsView來顯示DataTable中單個行的詳細信息。如何動態隱藏DetailsView中的字段(字段數始終爲0)

我做不是在設計的時候知道列名,所以我在標記中有AutoGenerateRows = true

DataView dv = myDataTable.AsDataView(); 
dv.RowFilter = string.Format("ResourceID = {0}", resourceId); 

dvScoresBreakdown.DataSource = dv; 
dvScoresBreakdown.DataBind(); 

大約有4列在DataView,我不希望DetailsView顯示 - 主要是ID列。

我明白,我應該訪問DataViewFields屬性,並設置相關領域的隱形:

dvScoresBreakdown.Fields[0].Visible = false; 
dvScoresBreakdown.Fields[1].Visible = false; 

然而,.Fields.Count始終爲零。所以我得到一個索引越界異常。

當我說「始終爲零」時,我的意思是在.DataBind()之後,以及在OnDataBinding,OnDataBoundOnPreRender事件之後爲零。

但是,DetailsView在頁面上呈現並顯示所有內容 - 原始DataView中的所有列 - 所以dataview是綁定的!

我在做什麼錯?

回答

3

我剛剛發現,做它的方法是在.DataBind()方法後刪除行。

dvScoresBreakdown.DataSource = dv; 
dvScoresBreakdown.DataBind(); 

dvScoresBreakdown.Rows[0].Visible = false; 
dvScoresBreakdown.Rows[1].Visible = false; 

希望這可以幫助別人!

-1

Columns集合只存儲顯式聲明的列,所以如果您使用自動生成的列,計數將爲零。 如果您使用自動生成的列,數據綁定後,你可以遍歷行集合,並做出相應的細胞無形的,如:

如果dvScoresBreakdown是GridView控件

dvScoresBreakdown .DataBind(); 
if (dvScoresBreakdown .Columns.Count > 0) 
    dvScoresBreakdown .Columns[0].Visible = false; 
else 
{ 
    dvScoresBreakdown .HeaderRow.Cells[0].Visible = false; 
    foreach (GridViewRow gvr in dvScoresBreakdown .Rows) 
    { 
     gvr.Cells[0].Visible = false; 
    } 
} 

我認爲這會幫助你。

+0

就像我說的,它是一個'DetailsView'控件而不是'GridView'。 「DetailsView」上沒有'.Columns'這樣的屬性。話雖如此,你確實讓我走上了看行集合的正確軌道 - 非常感謝! – bgs264