如何隐藏列(GridView)但仍访问其值?


77

我有一个带有DataSource(SQL数据库)的GridView 。我想隐藏一列,但是选择记录时仍然能够访问该值。有人可以告诉我该怎么做吗?

这是我要隐藏但仍要访问其值的列:

<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />

我尝试了所有隐藏列(property Visible="false")的方法,但是无法访问其值。

Answers:


44

如果我没有记错的话,GridView则不保存BoundColumns具有属性的值visible="false"。您可以在此处执行两项操作,其中一项(如V4Vendetta的回答所述)Datakeys。或者,您也可以将其更改BoundColumnTemplateField。并在其中ItemTemplate添加一个控件Label,使它的可见性为false并为其赋予价值Label


6
这将隐藏列,但不会隐藏Column标头。你会怎么做?
阿波罗

2
只需在您的边界域中添加<HeaderStyle CssClass =“ hidden” />。并定义如下CSS样式:.hidden {display:none; }
菲利普(Philippe)

85
<head runat="server">
<title>Accessing GridView Hidden Column value </title>
<style type="text/css">
  .hiddencol
  {
    display: none;
  }
</style>

<asp:BoundField HeaderText="Email ID" DataField="EmailId" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >
</asp:BoundField>

ArrayList EmailList = new ArrayList();
foreach (GridViewRow itemrow in gvEmployeeDetails.Rows)
{
  EmailList.Add(itemrow.Cells[YourIndex].Text);
}

有关此解决方案的深入说明,请参见netomatix.com/development/GridViewHideColumn.aspx
马塞尔(Marcel)2012年

2
该解决方案的另一个优点是,仍然可以在客户端的javascript中访问数据。应该是这个问题的首选解决方案!
Shaun Keon

42

在CSS中定义样式:

.hiddencol { display: none; }

然后将ItemStyle-CssClass="hiddencol"HeaderStyle-CssClass="hiddencol"属性添加到网格字段:

<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol"  HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />

这是一个更为有效的答案
ImCrimson

36

您可以使用DataKeys检索此类字段的值,因为(如您所说)将法线设置BoundField为可见的false时,您无法获取它们的值。

.aspx文件中设置GridView属性

DataKeyNames = "Outlook_ID"

现在,在事件处理程序中,您可以像下面这样访问此键的值:

grid.DataKeys[rowIndex]["Outlook_ID"]

这将在网格的指定行索引处为您提供ID。


1
DataKeys的目的是什么
Antoine Pelletier

如果将DataSource控件与HTML中的CRUD代码一起使用,这将如何工作?
汉宁顿曼波

23

您可以通过编程方式执行此操作:

grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;

这样,您可以在数据绑定之前将列设置为可见,以便生成该列。您将列设置为不可见,因此不会显示。


1
根本不起作用,将代码放在Panel PreRender方法中时会出现ArrayOutOfBoundsException。
Chexpir

2
为我工作简单而轻松。
RustyH 2014年

到目前为止,这是最好的答案。
Talha Imam

11

如果确实TemplateField在您的列的内部,GridView并且您有绑定到它的名为blah的控件。然后像这样放置outlook_id一个HiddenField

<asp:TemplateField HeaderText="OutlookID">
    <ItemTemplate>
        <asp:Label ID="blah" runat="server">Existing Control</asp:Label>
        <asp:HiddenField ID="HiddenOutlookID" runat="server" Value='<%#Eval("Outlook_ID") %>'/>
    </ItemTemplate>
</asp:TemplateField>

现在,在想要的事件中抓住该行outlook_id,然后访问该控件。
对于RowDataBound访问它像:

string outlookid = ((HiddenField)e.Row.FindControl("HiddenOutlookID")).Value;

如果您无法访问所单击的行,请务必返回。并且不要忘了提及您想访问的事件。


8

您可以hidden在服务器端创建该列,由于某种原因,这与aspx编写代码有所不同。仍然可以引用它,就像它是可见的一样。只需将此代码添加到您的OnDataBound事件中即可。

protected void gvSearchResults_DataBound(object sender, EventArgs e)
{
    GridView gridView = (GridView)sender;

    if (gridView.HeaderRow != null && gridView.HeaderRow.Cells.Count > 0)
    {
        gridView.HeaderRow.Cells[UserIdColumnIndex].Visible = false;
    }

    foreach (GridViewRow row in gvSearchResults.Rows)
    {
        row.Cells[UserIdColumnIndex].Visible = false;
    }
}

这有效。对于所有人,您都需要确保标题栏和网格视图栏都被隐藏。
Danrex

4

在填充之前留出可见的列GridView。填写GridView,然后隐藏列。


2

下面是如何获得在一个隐藏的列的值GridView被设置为Visible=False:在这种情况下,添加数据字段SpecialInstructions到绑定的GridView的DataKeyNames属性,并获得这种方式。

txtSpcInst.Text = GridView2.DataKeys(GridView2.SelectedIndex).Values("SpecialInstructions")

就是这样,它每次都非常简单。


2

我有一个新的解决方案,使用cssjavascriptjquery在客户端隐藏列。

.col0
{
  display: none;
}

在添加列的aspx文件中,您应该指定CSS属性:

<asp:BoundField HeaderText="Address Key" DataField="Address_Id" ItemStyle-CssClass="col0" HeaderStyle-CssClass="col0" > </asp:BoundField>

1

我使用了类似于user496892的方法:

SPBoundField hiddenField = new SPBoundField();
hiddenField.HeaderText = "Header";
hiddenField.DataField = "DataFieldName";
grid.Columns.Add(hiddenField);

grid.DataSource = myDataSource;
grid.DataBind();

hiddenField.Visible = false;

0

您可以在后面编写代码。

Set visible= false用于数据绑定后的列。之后,您可以再次在网格视图的row_selection函数中执行可见性“ true ”。它将起作用!


0

当我想要访问GridView之前的值时,GridView出现。

  1. 我有一个BoundField并且DataField名义上绑定。
  2. RowDataBound事件中,我做在这种情况下一些过程。
  3. GridView出现之前,我这样写:

    protected void GridviewLecturer_PreRender(object sender, EventArgs e) 
    {
        GridviewLecturer.Columns[0].Visible = false;
    }
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.