2012-09-12 90 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