【问题标题】:How to dynamically hide fields in a DetailsView (fields count is always 0)如何在 DetailsView 中动态隐藏字段(字段数始终为 0)
【发布时间】:2012-09-12 09:56:26
【问题描述】:

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

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

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

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

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

我知道我应该访问DataViewFields 属性并将相关字段设置为不可见:

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

但是,.Fields.Count 始终为零。所以我得到一个索引越界异常。

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

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

我做错了什么?

【问题讨论】:

    标签: asp.net detailsview


    【解决方案1】:

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

    dvScoresBreakdown.DataSource = dv;
    dvScoresBreakdown.DataBind();
    
    dvScoresBreakdown.Rows[0].Visible = false;
    dvScoresBreakdown.Rows[1].Visible = false;
    

    希望这可以帮助其他人!

    【讨论】:

      【解决方案2】:

      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;
          }
      }
      

      我想这会对你有所帮助。

      【讨论】:

      • 就像我说的,它是DetailsView 控件而不是GridViewDetailsView 上没有 .Columns 这样的属性。话虽如此,您确实让我走上了查看行集合的正确轨道-非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多