如何隐藏列(GridView)但仍访问其值?
Posted
技术标签:
【中文标题】如何隐藏列(GridView)但仍访问其值?【英文标题】:How to hide a column (GridView) but still access its value? 【发布时间】:2011-07-19 13:50:26 【问题描述】:我有一个带有DataSource
(SQL 数据库)的 GridView。我想隐藏一列,但在选择记录时仍然可以访问该值。有人可以告诉我怎么做吗?
这是我要隐藏但仍要访问其值的列:
<asp:BoundField DataField="Outlook_ID" HeaderText="OutlookID" />
我尝试了所有方法来隐藏该列(属性Visible="false"
),但我无法访问它的值。
【问题讨论】:
【参考方案1】:<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,了解有关此解决方案的深入说明。 这个解决方案还有一个额外的优势,即数据仍然可以在客户端的 javascript 中访问。应该是这个问题的首选解决方案! 你是个传奇!【参考方案2】:如果我没记错的话,GridView
不包含具有visible="false"
属性的BoundColumns
的值。您可以在这里做两件事,一件事(如 V4Vendetta 的回答中所述)使用Datakeys
。或者您可以将您的BoundColumn
更改为TemplateField
。在ItemTemplate
中,添加一个类似Label
的控件,使其可见性为false,并为Label
赋予您的价值。
【讨论】:
这会隐藏列,但不会隐藏列标题。你将如何做到这一点? 只需在您的边界域中添加在css中定义一个样式:
.hiddencol display: none;
然后将ItemStyle-CssClass="hiddencol"
和HeaderStyle-CssClass="hiddencol"
属性添加到网格字段:
<asp:BoundField DataField="ID" HeaderText="ID" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" ClientIDMode="Static" />
【讨论】:
这是一个更有效的答案【参考方案4】:您可以使用 DataKeys 来检索此类字段的值,因为(如您所说)当您将普通 BoundField
设置为可见 false 时,您无法获取它们的值。
在.aspx
文件中设置GridView
属性
DataKeyNames = "Outlook_ID"
现在,在事件处理程序中,您可以像这样访问此键的值:
grid.DataKeys[rowIndex]["Outlook_ID"]
这将为您提供网格指定行索引处的 id。
【讨论】:
DataKeys 意味着什么 如果您在 html 中使用带有 CRUD 代码的 DataSource 控件,这将如何工作...?【参考方案5】:您可以通过编程方式完成:
grid0.Columns[0].Visible = true;
grid0.DataSource = dt;
grid0.DataBind();
grid0.Columns[0].Visible = false;
通过这种方式,您在数据绑定之前将列设置为可见,因此会生成该列。 您将列设置为不可见,因此不显示。
【讨论】:
根本不工作,当我将该代码放在 Panel PreRender 方法中时,我得到 ArrayOutOfBoundsException。 为我工作简单轻松。 这是迄今为止最好的答案。【参考方案6】:如果您在GridView
的列中确实有一个TemplateField
,并且您有一个名为 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;
如果您在访问单击的行时遇到问题,请返回。并且不要忘记提及您想参加的活动。
【讨论】:
【参考方案7】:您可以在服务器端创建列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;
【讨论】:
这行得通。对于寻找的每个人,您需要确保标题列和网格视图列都被隐藏。【参考方案8】:在填写GridView
之前保留可见列。填写GridView
,然后隐藏列。
【讨论】:
【参考方案9】:这里是如何获取 GridView
中设置为 Visible=False
的隐藏列的值:将本例中的数据字段 SpecialInstructions
添加到绑定的 GridView 的 DataKeyNames 属性中,并通过以下方式访问它大大地。
txtSpcInst.Text = GridView2.DataKeys(GridView2.SelectedIndex).Values("SpecialInstructions")
就是这样,每次都很简单。
【讨论】:
【参考方案10】:我有一个新的解决方案,使用 css 或 javascript 或 jquery 在客户端隐藏列。
.col0
display: none !important;
在您添加列的 aspx 文件中,您应该指定 CSS 属性:
<asp:BoundField HeaderText="Address Key" DataField="Address_Id" ItemStyle-CssClass="col0" HeaderStyle-CssClass="col0" > </asp:BoundField>
【讨论】:
【参考方案11】:我使用了类似于user496892的方法:
SPBoundField hiddenField = new SPBoundField();
hiddenField.HeaderText = "Header";
hiddenField.DataField = "DataFieldName";
grid.Columns.Add(hiddenField);
grid.DataSource = myDataSource;
grid.DataBind();
hiddenField.Visible = false;
【讨论】:
【参考方案12】:你可以在后面写代码。
Set visible= false
用于数据绑定后的列。
之后,您可以再次在网格视图中的 row_selection 函数中执行可见性“true”。它将起作用!!
【讨论】:
【参考方案13】:我搜索了很多,但没有运气。他们中的大多数人都在处理一些错误。最后我使用了这段代码,它对我有用。 可能您应该将 1 更改为其他值。对我来说,我会隐藏第二列。
protected voidfoundedDrGridView_RowDataBound(object sender, GridViewRowEventArgs e)
if(e.Row.RowType!=DataControlRowType.Pager)e.Row.Cells[1].Visible = false;
【讨论】:
【参考方案14】:当我想在出现GridView
之前从GridView
访问某些值时。
-
我有一个
BoundField
并通常绑定DataField
。
在RowDataBound
事件中,我在那个事件中做了一些处理。
在GridView
出现之前,我写了这个:
protected void GridviewLecturer_PreRender(object sender, EventArgs e)
GridviewLecturer.Columns[0].Visible = false;
【讨论】:
以上是关于如何隐藏列(GridView)但仍访问其值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 GridView 中隐藏 TemplateField 列