C# 从Gridview的可见假边界字段检索数据

C# 从Gridview的可见假边界字段检索数据,c#,gridview,boundfield,rowcommand,C#,Gridview,Boundfield,Rowcommand,我在GridView <asp:BoundField DataField="ReportId" HeaderText="RId" Visible="false" /> 但是,如果我将BoundField的.Visible属性更改为true尝试使用客户端html来隐藏这样的想法,它将返回正确的值 <style type="text/css"> .hidden { display:none; } </style>

我在
GridView

<asp:BoundField DataField="ReportId" HeaderText="RId" Visible="false" />

但是,如果我将
BoundField的
.Visible
属性更改为
true

尝试使用客户端html来隐藏这样的想法,它将返回正确的值

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

<asp:BoundField DataField="ReportId" HeaderText="RId" HeaderStyle-CssClass="hidden"   >

</asp:BoundField>

.隐藏
{
显示:无;
}

据我所知,当您将绑定字段设置为不可见时,则无法访问它。尝试使用TemplateField,我也遇到了同样的问题

有趣的是,DataGrid不会有这个问题,它允许您访问隐藏列中的数据,即使它甚至没有在客户端中呈现这些数据,因为它仍然会将隐藏列的信息添加到ViewState中

另一方面,即使将EnableViewState属性设置为true,GridView也会忽略隐藏字段。唯一的方法是将信息保留在那里,以便客户端使用样式属性隐藏,如display:none


不幸的是,我喜欢DataGrid在这方面的表现,但GridView还有其他优势。

尽管这是一个一年前的问题(事实上正好是一年前的问题),但这里有另一个不使用CssClass的解决方法

在数据绑定之后,将所需列的可见性设置为false

gridview1.databind()
gridview1.columns(i).Visibile = False

这将在viewstate中维护数据,但不会为页面创建标记。

如果GridView列被标记为不可见,则在运行时不会填充该列,因此它不会返回任何内容。因此,我只是从绑定到Gridview的DataView填充了超链接,并记住将DataView声明为共享

我在VB asp.net中为GridView做了这项工作,GridView从日历数据库中查找搜索到的事件

这对我来说太棒了

Private Sub GridView1_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound

  If (e.Row.RowType = DataControlRowType.DataRow) Then

    Dim ThisHyperLink As HyperLink = e.Row.Cells(0).Controls(0)
    Dim drvRow As DataRowView = dvFoundEvents.Item(e.Row.DataItemIndex)

    EventID = drvRow("EventID")
    ThisHyperLink.NavigateUrl = "<URL>?id=" + EventID

  End If

End Sub
Private子GridView1\u RowDataBound(发送者作为对象,e作为System.Web.UI.WebControl.GridViewRowEventArgs)处理GridView1.RowDataBound
如果(e.Row.RowType=DataControlRowType.DataRow),则
将此超链接设置为HyperLink=e.Row.Cells(0)。控件(0)
Dim drvRow As DataRowView=dvFoundEvents.Item(e.Row.DataItemIndex)
EventID=drvRow(“EventID”)
ThisHyperLink.NavigateUrl=“?id=“+事件id”
如果结束
端接头
这对我很有用:


如果列是网格上的命名DataKeyValue,则可以将行中发送的e.Item转换为DataGridItem并调用其DataKeyValue。您需要将其转换为Int、String或其他格式,但即使列为visible=false,它也会存在。

在rowDataBound事件中,您可以使用以下方式访问字段的值:

(((DataRowView)e.Row.DataItem)["your_boundField_dataFieldName"]).ToString();

即使您的boundfield可见性设置为false。

第一个解决方案工作正常,但必须添加标题样式以隐藏此列的标题

gridview1.databind()
gridview1.columns(i).Visibile = False
<style type="text/css">
     .hidden
     {
         display:none;
     }
</style>

<asp:BoundField DataField="ReportId" HeaderText="RId"  >
    <ItemStyle CssClass="hidden"/>
    <HeaderStyle CssClass="hidden"/>
</asp:BoundField>

.隐藏
{
显示:无;
}

我认为一些优化是在幕后进行的,绑定在可见之前不会真正发生。您可以尝试使用简单的html样式显示吗none@lc. 我只是以正常的方式绑定数据源。也没有太多的Gridview经验。
Visible=“false”
不只是在客户端“隐藏”该字段,它甚至不向客户端发送数据。所以不可能从客户那里拿回。因此,不要设置
Visible=“false”
,而是使用一个
CssClass
,它将在客户端的视图中隐藏它,但数据仍然存在。然后,数据将在回发时再次在服务器端可用。正如COLD-Teld所建议的,但是没有输入错误:),记住设置标题的可见性。这是否回答了您的问题+1在发布我自己的答案之前,我没有阅读你的答案。:)我将删除我的。@hmqcnoesy很好,我同意你的观点,即当我们设置visible='true'时,整行不会发送到客户端。通常标题也应该隐藏,因此我们需要将HeaderStyle CssClass=“hidden”添加到BoundField标记中。添加这一点也只隐藏标题\