我有一个网格视图,并且正在使用各种数据:
<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:未将对象引用设置为对象的实例。
我做错了什么?如何阻止用户看到这些字段?
答案 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;