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

Tas*_*sto 71 c# asp.net gridview hide

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

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

<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />
Run Code Online (Sandbox Code Playgroud)

我尝试了一切来隐藏列(属性Visible="false"),但我无法访问它的值.

小智 83

<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);
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案具有额外的优势,即仍可在客户端的javascript中访问数据.应该是这个问题的首选解决方案! (2认同)

fut*_*ile 44

如果我没有弄错,GridView不保持BoundColumns具有该属性的值visible="false".你可以在这里做两件事,一件(如V4Vendetta的答案中所解释的)要使用Datakeys.或者你可以改变你BoundColumnTemplateField.在其中ItemTemplate,添加一个控件Label,使其可见性为false,并为此赋予您的价值Label.

  • 这会隐藏列,但不会隐藏Column标头.你会怎么做? (6认同)
  • 只需在您的边界字段中添加 &lt;HeaderStyle CssClass="hidden" /&gt; 即可。并定义这样的 css 样式: .hidden { display:none; } (2认同)

Nil*_*far 39

在css中定义样式:

.hiddencol { display: none; }
Run Code Online (Sandbox Code Playgroud)

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

<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol"  HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />
Run Code Online (Sandbox Code Playgroud)


V4V*_*tta 34

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

.aspx文件中设置GridView属性

DataKeyNames = "Outlook_ID"
Run Code Online (Sandbox Code Playgroud)

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

grid.DataKeys[rowIndex]["Outlook_ID"]
Run Code Online (Sandbox Code Playgroud)

这将为您提供网格指定rowindex的id.


小智 20

你可以通过编程方式完成:

grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在数据绑定之前将列设置为可见,以便生成列.您将列设置为不可见,因此不会显示.

  • 根本不工作,当我将该代码放入 Panel PreRender 方法时,我得到 ArrayOutOfBoundsException。 (2认同)
  • 为我工作简单易行. (2认同)

nav*_*een 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>
Run Code Online (Sandbox Code Playgroud)

现在,在您想要的事件中获取行outlook_id,然后访问该控件.
对于RowDataBound访问它像:

string outlookid = ((HiddenField)e.Row.FindControl("HiddenOutlookID")).Value;
Run Code Online (Sandbox Code Playgroud)

如果您在访问点击的行时遇到问题,请回来.并且不要忘记提及您想要访问的事件.


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)