从GridView中的Visible False BoundField检索数据

7

我有一个在GridView中的BoundField

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

但是当我尝试获取该字段中的文本时,它返回为空。
protected void gvwReports_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "ViewSchedule")
    {
        int index = Convert.ToInt32(e.CommandArgument);
        GridViewRow row = gvwReports.Rows[index];
        string s = row.Cells[0].Text;
    }
}

但是,如果我将BoundField.Visible属性更改为true,它会返回正确的值。


我认为在幕后进行了一些优化,绑定实际上直到它变得可见才会发生。 - lc.
你可以尝试使用简单的HTML样式"display none"吗? - COLD TOLD
@lc。我只是以正常的方式绑定数据源,而且对GridView也没有太多经验。 - Darshana
1
Visible="false" 不仅会在客户端上“隐藏”该字段,甚至不会将数据发送到客户端。因此,无法从客户端获取它。因此,不要设置 Visible="false",而是使用一个 CssClass 在客户端上隐藏它,但数据仍然存在。然后,在 postback 时,数据将再次可用于服务器端。就像 COLD TOLD 建议的那样,但没有拼写错误 :), 并记得设置标题的可见性。 - hmqcnoesy
这个回答是否解决了你的问题?[如何隐藏GridView中的一列但仍然能够访问其值?] (https://dev59.com/CW435IYBdhLWcg3whAWx) - Michael Freidgeim
8个回答

25

试试像这样使用客户端 HTML 隐藏

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

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

</asp:BoundField>

+1 在我发表自己的回答之前,我没有看到你的回答。 :) 我会把我的回答删除。 - hmqcnoesy
@hmqcnoesy,很好,我同意你的观点,当我们将visible ='true'设置时,整个行并不会被发送到客户端。 - Waqar Janjua
4
通常表头也应该隐藏,因此我们需要在 BoundField 标签中添加 HeaderStyle-CssClass="hidden"。 - Saber
请添加以下内容:<HeaderStyle CssClass="hidden"/> - Bino
这只是隐藏标题栏而已。 - Bibin

4

虽然这是一个一年前的问题(实际上正好是一年前),但这里有另一种解决方法,而不使用CssClass。

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

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

这将保留视图状态中的数据,但不会为页面创建标记。

2
第一个解决方案可以正常工作,但需要添加HeaderStyle来隐藏此列的标题。
<style type="text/css">
     .hidden
     {
         display:none;
     }
</style>

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

0
在rowDataBound事件中,您可以使用类似以下方式访问字段的值:
(((DataRowView)e.Row.DataItem)["your_boundField_dataFieldName"]).ToString();

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


0

这对我有用:

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


0

看起来如果GridView列被标记为不可见,则在运行时它不会被填充,因此它返回空值。因此,我只是从绑定到Gridview的DataView中填充了超链接,记得将DataView声明为共享。

我在VB asp.net中为从日历数据库中查找搜索事件的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

0

我也遇到了同样的问题。

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

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

真的很遗憾,我喜欢DataGrid的这种行为,但是GridView还有其他优点。


0

根据我的了解,当您将绑定字段设置为不可见时,就无法访问它。尝试使用TemplateField。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接