8

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

<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:对象引用未设置为对象的实例。

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

4

6 回答 6

9

Trevor 是正确的,您需要DataKeyNames在 DataGrid 标记中设置如下:

<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();
    }
于 2013-07-01T21:45:50.003 回答
5

尝试让它们 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>
于 2013-07-01T21:26:14.753 回答
3

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

于 2013-07-01T21:13:37.793 回答
1

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

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

然后,您可以在后面的代码中检索该列值,如下所示。

string showId = (string) GridView1.DataKeys[6].Value.ToString();
于 2013-07-01T21:38:29.640 回答
1

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

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

现在是正确的工作

于 2015-08-07T13:16:27.927 回答
0

尝试使用 font-size 逻辑使用

例如

grid.Columns[0].HeaderStyle.Font.Size = grid.Columns[0].ItemStyle.Font.Size = 0;
于 2017-08-22T09:44:49.387 回答