隐藏BoundField但仍能用C#获取值

时间:2013-07-01 21:06:06

标签: c# asp.net

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

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

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

6 个答案:

答案 0 :(得分:8)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

如果要隐藏列并获取其值,请在aspx页面中为GridView指定DataKeyNames属性。

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

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

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

答案 4 :(得分:1)

上面的代码隐藏了BoundField值,但没有隐藏headertext和miss匹配所有列,所以我会更改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>

现在这是正确的工作

答案 5 :(得分:0)

尝试使用font-size

进行逻辑使用

e.g。

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