我的GridView
定义如下:
<asp:GridView ID="myGridView" AutoGenerateColumns="false" runat="server"
OnLoad="myGridView_Load" OnRowCommand="myGridView_Command" OnRowEditing="myGridView_RowEditing" OnRowDeleting="myGridView_RowDeleting" DataKeyNames="ID" >
<Columns>
<asp:BoundField DataField="ID" Visible="false" />
<asp:BoundField DataField="BirthDate" Visible="false" />
<asp:BoundField DataField="FirstName" HeaderText="First Name" />
<asp:BoundField DataField="LastName" HeaderText="Last Name" />
<asp:TemplateField HeaderText="Other">
<ItemTemplate>
<asp:LinkButton ID="editLB" runat="server" Text="edit" CommandName="Edit" />
<asp:LinkButton ID="deleteLB" runat="server" Text="delete" CommandName="Delete" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
当用户点击编辑按钮时,我需要获取BirthDate
列的值。为了尝试这一点,我尝试了以下内容:
protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
DateTime birthDate = (DateTime)(row.Cells[1].Text);
// Does not work
}
我知道这与列不可见这一事实有关。必须隐藏该列。但我需要获得这个价值 - 我该怎么做?
答案 0 :(得分:9)
问题是,当BoundField
的Visibility属性设置为false时,该列不会呈现给客户端。解决方法是使用HiddenField
中的TemplateField
代替。
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField ID="HiddenField1" runat="server"
Value='<%# Eval("BirthDate") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:HiddenField ID="HiddenField1" runat="server"
Value='<%# Eval("BirthDate") %>' />
</EditItemTemplate>
</asp:TemplateField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = GridView.Rows[e.NewEditIndex];
HiddenField hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1");
DateTime birthDate = Convert.ToDateTime(hidden.Value);
}
修改强>
上面的方法仍然会在表格中显示列,因此您最终得到一个空列。它工作但不是最好的解决方案,这里隐藏BirthDate字段但仍然在RowEditing
事件处理程序中获取其值。请记住,BirthDate仍会呈现给客户端,只是没有显示。
<style type="text/css">
.hide
{
display:none;
}
</style>
<asp:BoundField DataField="BirthDate">
<ItemStyle CssClass="hide"/>
</asp:BoundField>
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = GridView1.Rows[e.NewEditIndex];
DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text);
}
答案 1 :(得分:5)
要隐藏内容以及网格中的标题,请使用以下代码:
并像往常一样访问该列。 GridView.SelectedRow.Cells[index].Text;
<style type="text/css">
.hide
{
display:none;
}
<asp:BoundField DataField="MailRoomID" HeaderText="Mailroom ID" ItemStyle-HorizontalAlign="Center" ShowHeader="false" ><ItemStyle CssClass="hide" /><HeaderStyle CssClass="hide"/></asp:BoundField>
答案 2 :(得分:2)
我做过类似的事情(适应你的例子):
string[] keyList = new string[1];
keyList[0] = "BirthDate";
myGridView.DataKeyNames = keyList;
然后我将GridView绑定到一个DataTable,该DataTable有一个名为“BirthDate”的列。此列下的数据将存储在上面指定的DataKeyName下。
为了获得所需的价值,我会做这样的事情:
protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
DataKeyArray keyList = myGridView.DataKeys as DataKeyArray;
if (keyList != null)
DateTime birthDate = keyList[e.NewEditIndex];
}
然而,我意识到这并不涉及隐藏的领域。
答案 3 :(得分:1)
查看以下文章,该文章介绍了如何访问GridView不可见列:
http://www.highoncoding.com/Articles/178_Access_GridView_Invisible_Columns.aspx
这个想法基本上是使用TemplateField列而不是BoundColumn。
答案 4 :(得分:0)
这是从基础数据中获取数据的一种方法
protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate"));
}
答案 5 :(得分:0)
我会使用Phaedrus建议的隐藏字段建议,然后在你的代码中;使用这样的东西:
GridViewRow row = gvUsers.Rows[e.NewEditIndex];
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate");
DateTime birthDate = DateTime.Parse(hfBirthDate.Value);