如何动态隐藏DetailsView中的字段(字段数始终为0)

时间:2012-09-12 09:56:26

标签: asp.net detailsview

我使用DetailsView来显示DataTable中单行的详细信息。

在设计时知道列名,所以我在标记中有AutoGenerateRows = true

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

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

DataView中有大约4列,我不希望显示DetailsView - 主要是ID列。

我了解我应该访问Fields的{​​{1}}属性并将相关字段设置为不可见:

DataView

但是,dvScoresBreakdown.Fields[0].Visible = false; dvScoresBreakdown.Fields[1].Visible = false; 始终为零。所以我得到一个超出范围的索引异常。

当我说“始终为零”时,我的意思是它在.Fields.Count之后,以及.DataBind()OnDataBindingOnDataBound事件中都为零。

但是,DetailsView会在页面上呈现并显示所有内容 - 原始OnPreRender中的所有列 - 所以数据视图是绑定的!

我做错了什么?

2 个答案:

答案 0 :(得分:4)

我刚刚发现,这样做的方法是在.DataBind()方法之后立即删除行。

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

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

希望这可以帮助别人!

答案 1 :(得分:-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;
    }
}

我认为这会对你有帮助。