Asp.net 如何访问隐藏的Gridview列的值?
我有一个Id列需要以编程方式访问,但我不希望它显示在GridView中。我可以通过这种方式将其隐藏在代码隐藏的Page_Load事件中:Asp.net 如何访问隐藏的Gridview列的值?,asp.net,gridview,hide,code-behind,column-width,Asp.net,Gridview,Hide,Code Behind,Column Width,我有一个Id列需要以编程方式访问,但我不希望它显示在GridView中。我可以通过这种方式将其隐藏在代码隐藏的Page_Load事件中: GridView1.Columns[0].Visible = false; …但我无法从隐藏列中检索值。我有一个选择按钮,因为我用这个设置了我的GridView:AutoGenerateSelectButton=“True” …但当我尝试访问该值时,它会给我一个空字符串: protected void GridView1_SelectedIndexChang
GridView1.Columns[0].Visible = false;
…但我无法从隐藏列中检索值。我有一个选择按钮,因为我用这个设置了我的GridView:AutoGenerateSelectButton=“True”
…但当我尝试访问该值时,它会给我一个空字符串:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
string movieId = string.Empty;
GridViewRow grv = GridView1.SelectedRow;
movieId = grv.Cells[1].Text;
. . .
如何访问该值?我甚至尝试访问索引0处的值,以防“Select”按钮列被认为位于索引-1处,也就是说,因为它不是数据集的一部分),但这也为movieId分配了一个空字符串!索引2确实有效,但它不是我需要的值——它是电影标题
简单地说,我可以在“更多”和“标题”之间隐藏“ID”(电影ID)列:
…但我无法访问隐藏的电影ID列。隐形并不意味着它不存在
aspx文件中的我的GridView:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
OnDataBound="GridView1_DataBound" OnPreRender="GridView1_PreRender"
OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
AutoGenerateSelectButton="True">
<Columns>
<asp:BoundField DataField="MovieId" HeaderText="Movie Id" ItemStyle-
Width="0%" SortExpression="MovieId" />
<asp:BoundField DataField="MovieTitle" HeaderText="MovieTitle"
SortExpression="MovieTitle" />
<asp:BoundField DataField="IMDBRating" HeaderText="IMDBRating"
SortExpression="IMDBRating" />
<asp:BoundField DataField="MPAARating" HeaderText="MPAARating"
SortExpression="MPAARating" />
<asp:BoundField DataField="YearReleased" HeaderText="YearReleased"
SortExpression="YearReleased" />
<asp:BoundField DataField="Minutes" HeaderText="Minutes"
SortExpression="Minutes" />
</Columns>
</asp:GridView>
…同样,在Page_Load事件中,我有:
GridView1.Columns[0].Visible = false;
…这确实会导致ID列在视觉上“消失”(而且似乎是其他方式)
所以“更多”(选择按钮)列位于GridView的索引0处,我希望ID位于索引1处(尽管不可见)
我试图在SelectedIndexChanged事件中获取它,如下所示:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
string movieId = string.Empty;
. . .
GridViewRow grv = GridView1.SelectedRow;
// Index 0 should be the "MORE" (Select button) column; index 1 the
hidden ID (MovieId) column, index 2 the Title (MovieTitle), etc.
movieId = grv.Cells[0].Text; // movieId is "" after this line; the actual
text in that column is "Select"
movieId = grv.Cells[1].Text; // movieId is "" after this line; the column
is invisible
movieId = grv.Cells[2].Text; // movieId is the value in the [Movie] Title
column after this line; visually, this is column index 1, but I'm
expecting it to be actually index 2
. . .
如果您有如下隐藏字段:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
如果您有如下隐藏字段:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
您没有提到您是否“只是”拥有一个datagrid控件,并且正在推进(比如)一个datatable
在这种情况下,您没有可以使用和隐藏列的模板结构
GridView1.Columns[0].Visible = false;
如果没有模板化字段(boundcolum模板),则数据绑定后不存在列集合
但您可以使用以下命令拦截每个行绑定事件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow | e.Row.RowType == DataControlRowType.Header)
{
GridViewRow gRow = e.Row;
gRow.Cells(1).Visible = false;
}
}
因此,请注意我们是如何捕获标题行绑定事件或数据行的。因此,我们只需将第二列visible设置为false
注意:在大多数情况下,当您将控件visible设置为false时,它不会发送到浏览器。在这种情况下,这是正确的!通常我们必须使用
Cells(1).Style("Display") = "none"
这将隐藏列,但仍会将数据发送到浏览器。但是,在这种情况下(非常罕见),柱仍然可用,但不会在浏览器中发送/渲染。事实上,这是非常完美的,因为它增强了安全性—实际上您并没有将PK值发送到浏览器—这大大提高了安全性。但是,如果您有/引入浏览器端JavaScript?然后最好使用样式,因为visible意味着PK id值永远不会发送到浏览器,客户端代码因此无法获取/使用PK值(带js的客户端)
好的,现在上面的内容将为您隐藏该列
现在,在SelectedIndex change事件中,您仍然可以像下面这样获取PK值:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
因此,此答案的大部分假设/取决于您是否只是在数据表中推送,并且模板中没有任何asp:BoundFields,如下图所示:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
您没有提到您是否“只是”拥有一个datagrid控件,并且正在推进(比如)一个datatable
在这种情况下,您没有可以使用和隐藏列的模板结构
GridView1.Columns[0].Visible = false;
如果没有模板化字段(boundcolum模板),则数据绑定后不存在列集合
但您可以使用以下命令拦截每个行绑定事件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow | e.Row.RowType == DataControlRowType.Header)
{
GridViewRow gRow = e.Row;
gRow.Cells(1).Visible = false;
}
}
因此,请注意我们是如何捕获标题行绑定事件或数据行的。因此,我们只需将第二列visible设置为false
注意:在大多数情况下,当您将控件visible设置为false时,它不会发送到浏览器。在这种情况下,这是正确的!通常我们必须使用
Cells(1).Style("Display") = "none"
这将隐藏列,但仍会将数据发送到浏览器。但是,在这种情况下(非常罕见),柱仍然可用,但不会在浏览器中发送/渲染。事实上,这是非常完美的,因为它增强了安全性—实际上您并没有将PK值发送到浏览器—这大大提高了安全性。但是,如果您有/引入浏览器端JavaScript?然后最好使用样式,因为visible意味着PK id值永远不会发送到浏览器,客户端代码因此无法获取/使用PK值(带js的客户端)
好的,现在上面的内容将为您隐藏该列
现在,在SelectedIndex change事件中,您仍然可以像下面这样获取PK值:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
因此,此答案的大部分假设/取决于您是否只是在数据表中推送,并且模板中没有任何asp:BoundFields,如下图所示:
<asp:HiddenField Id="HiddenField1" runat="server"/>
string movieId = ((HiddenField)Gridivew1.SelectedRow.Cells[1].FindControl("HiddenField1")).Value;
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Debug.Print("row id = " + GridView1.SelectedRow.Cells(1).Text);
}
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
etc. etc. etc.
</Columns>
不,我没有使用HiddenField元素;我只需要Id列存在,但不可见。即使我可以给它一个0或者1的宽度,我想也没关系;我只需要Id列存在,但不可见。即使我可以给它一个0或者1的宽度,我想也没问题。我可以隐藏它,请查看更新。很抱歉没有从GitGo提供更多信息,因为我在GridView中有BoundField值。“GridView1.SelectedRow.Cells(1.Text)”是我正在做的,但没有用(字面意思是“movieId=grv.Cells[1].Text;”;理论上,这应该行得通!像我一样将可见代码移动到数据绑定事件。如前所述,如果您在几乎所有情况下都将控件visible设置为false,那么它将不会被呈现,因此不可用,也不是页面DOM的一部分。我必须隐藏第二列的大纲代码应该仍然可以使用模板列。移动到行数据绑定事件至少意味着该控件将被呈现并成为最终页面的一部分。因此,我不认为您可以在rowbind之外隐藏此内容,因为visible=false会导致该列永远不会成为最终页面和呈现的一部分。如前所述,我很惊讶使用visible甚至可以工作,但在这种情况下确实如此。(使用样式(“显示”)=在10种情况中有9种情况下为“无”)