我使用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()
,OnDataBinding
和OnDataBound
事件中都为零。
但是,DetailsView会在页面上呈现并显示所有内容 - 原始OnPreRender
中的所有列 - 所以数据视图是绑定的!
我做错了什么?
答案 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;
}
}
我认为这会对你有帮助。