【问题标题】:Hide BoundField's but still be able to get values with C#隐藏 BoundField,但仍然能够使用 C# 获取值
【发布时间】:2013-06-29 02:51:18
【问题描述】:

我有一个网格视图并且正在使用各种数据:

<asp:BoundField DataField="Catagory" HeaderText="Support Catagory" SortExpression="Catagory" />
<asp:BoundField DataField="AppName" HeaderText="Application Name" SortExpression="IncidentNumber" />
<asp:BoundField DataField="IncidentNumber" HeaderText="Incident #" SortExpression="IncidentNumber" />
<asp:BoundField DataField="Hours" HeaderText="Hours" SortExpression="Hours" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundField DataField="CreatedDate" HeaderText="Created Date" SortExpression="CreatedDate" />
<asp:BoundField DataField="PK_DailyTaskHours" HeaderText="" SortExpression="PK_DailyTaskHours" ReadOnly="true" />
<asp:BoundField DataField="PK_NonScrumStory" HeaderText="" SortExpression="PK_NonScrumStory" ReadOnly="true" />

但我不想显示最后两列,我正在使用它,以便可以使用此 C# 代码检索主键:

    string dailyTaskHoursPK = (string)e.Values["PK_DailyTaskHours"].ToString();
    string nonScrumStoryPK = (string)e.Values["PK_NonScrumStory"].ToString();
    SqlDataSource4.DeleteParameters["dailyTaskHoursPK"].DefaultValue = dailyTaskHoursPK;
    SqlDataSource4.DeleteParameters["nonScrumStoryPK"].DefaultValue = nonScrumStoryPK;

但是,我不想显示最后两列。但是当我设置时:

Visible="false"

并尝试运行程序我得到以下错误:

对象引用未设置为对象的实例。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

我做错了什么?如何防止用户看到这些字段?

【问题讨论】:

标签: c# asp.net


【解决方案1】:

Trevor 是正确的,您需要在 DataGrid 标记中像这样设置 DataKeyNames

<asp:GridView ID="GridView1" runat="server" 
        DataKeyNames="PK_DailyTaskHours,PK_NonScrumStory"

完成此操作后,您可以将值作为字符串返回,如下所示:

        protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        string dailyTaskHoursPK = GridView1.DataKeys[0].Values["PK_DailyTaskHours"].ToString();
        string nonScrumStoryPK = GridView1.DataKeys[0].Values["PK_NonScrumStory"].ToString();
    }

【讨论】:

    【解决方案2】:

    尝试让它们 Visible="true",但用 css 隐藏它们。

    <style type="text/css">
     .hidden-field
     {
         display:none;
     }
    </style>
    
    ...
    <asp:BoundField DataField="PK_DailyTaskHours" HeaderText="" SortExpression="PK_DailyTaskHours" ReadOnly="true" >
        <ItemStyle CssClass="hidden-field"/>
    </asp:BoundField>
    <asp:BoundField DataField="PK_NonScrumStory" HeaderText="" SortExpression="PK_NonScrumStory" ReadOnly="true" >
        <ItemStyle CssClass="hidden-field"/>
    </asp:BoundField>
    

    【讨论】:

    • 这确实会从框中删除文本,但仍可以看到单元格。
    • 这种方法对我有用——我只需要将类应用到 ItemStyle 和 HeaderStyle。 (而且我需要访问客户端而不是服务器端的值。)
    【解决方案3】:

    您还必须设置数据绑定控件的 DataKeyNames 属性。将 visible 设置为 false 将导致字段不发送到客户端,除非在 DataKeyNames 属性中指定了该字段。请参阅DataControlField.Visible Property 上的 msdn 页面。

    【讨论】:

    • 您能否详细说明 DataKeyNames 属性?我不确定你的意思。
    【解决方案4】:

    当你想隐藏一个列并获取它的值时,你可以在 aspx 页面中为 GridView 指定DataKeyNames 属性。

    <asp:GridView ID="GridView1" runat="server" DataKeyNames="PK_DailyTaskHours" ...>
    

    然后您可以在后面的代码中检索该列值。

    string showId = (string) GridView1.DataKeys[6].Value.ToString();
    

    【讨论】:

      【解决方案5】:

      上面的代码隐藏 BoundField 值但不隐藏 headertext 并错过匹配所有列,所以我会改变一些亲爱的

        <style type="text/css">
              .hidden-field
              {
                 display:none;
              }
        </style>
      

      ...

      <asp:BoundField DataField="PK_NonScrumStory" HeaderText=""  SortExpression="PK_NonScrumStory" ReadOnly="true" ItemStyle-CssClass="hidden-field" HeaderStyle-CssClass="hidden-field" >
      </asp:BoundField>
      

      现在可以正常工作了

      【讨论】:

        【解决方案6】:

        尝试使用 font-size 逻辑使用

        例如

        grid.Columns[0].HeaderStyle.Font.Size = grid.Columns[0].ItemStyle.Font.Size = 0;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-16
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多