如何获取 OnRowDataBound 函数中特定列的值?
How to get value of a specific column in OnRowDataBound function?
我有一个下拉菜单和一个网格视图。根据下拉列表中选择的值,我想更新网格视图第一列中指定的超链接的 NaviageURL。所以我使用 onRowDataBound 函数来动态更新超链接的 navigateurl 。而且,我正在尝试检索第一列 "ID" 的值以将其用作 OnRowDataBound 函数内的查询字符串,但我无法使其正常工作。
当我单击第一列中的超链接时,查询字符串没有任何值分配给变量 ID。所以,url 只是解析为 http://localhost/JobCosting/EditSavedTicket.aspx?ID=
预期的是,单击超链接打开的 url 应该将第一列中指定的值分配给查询字符串中的变量 ID。如果我使用 e.Row.Cells[1].Text 或 e.Row.Cells[2].Text,列值将被正确检索,但我需要零列中的值,该值未被检索。当我检查 e.Row.Cells[0].Text 的字符串 id 的长度时,它是零
网格视图:
<asp:GridView ID="GridView2" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="Saved_Work" OnRowDataBound="update_url"
Style="float: left; font-size: small; position: relative;
width: 82%; position: relative; top: -10px; height: 40px; font-size: small; text-align: left;
left: 30px;" align="left">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:HyperLink ID="Continue_SavedWork" runat="server" NavigateUrl='<%# Eval("ID", "~/EditSavedJob.aspx?ID={0}") %>'
Text='<%# Eval("ID") %>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="UserID" HeaderText="User" SortExpression="UserID" />
<asp:BoundField DataField="Date_Created" HeaderText="Last_Updated_On" SortExpression="Date_Created" />
</Columns>
</asp:GridView>
后面的代码:
protected void update_url(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//string NavigateUrl="<%# Eval('ID', 'EditSavedTicket.aspx?ID={0}) %>";
string id = e.Row.Cells[0].Text;
HyperLink hp = (HyperLink)e.Row.FindControl("Continue_SavedWork");
if (SavedWorkDD.SelectedValue.ToString() == "Tickets")
hp.NavigateUrl = string.Format("EditSavedTicket.aspx?ID={0}", id);
}
}
我怀疑您无法访问第一列文本的原因是它是模板列,而其他列是 BoundField
列。
您可以在 OnRowUpdated
事件处理程序中访问 DataItem
,而不是从控件中检索文本。例如,如果您要绑定到 DataTable,则可以像这样访问 DataRowView
:
protected void update_url(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var row = (DataRowView)e.Row.DataItem;
var id = (int)row["ID"];
// ...
}
}
这种方法比尝试查找控件并访问它们的值更可靠。即使您更改 UI,它也会继续工作。
我有一个下拉菜单和一个网格视图。根据下拉列表中选择的值,我想更新网格视图第一列中指定的超链接的 NaviageURL。所以我使用 onRowDataBound 函数来动态更新超链接的 navigateurl 。而且,我正在尝试检索第一列 "ID" 的值以将其用作 OnRowDataBound 函数内的查询字符串,但我无法使其正常工作。
当我单击第一列中的超链接时,查询字符串没有任何值分配给变量 ID。所以,url 只是解析为 http://localhost/JobCosting/EditSavedTicket.aspx?ID=
预期的是,单击超链接打开的 url 应该将第一列中指定的值分配给查询字符串中的变量 ID。如果我使用 e.Row.Cells[1].Text 或 e.Row.Cells[2].Text,列值将被正确检索,但我需要零列中的值,该值未被检索。当我检查 e.Row.Cells[0].Text 的字符串 id 的长度时,它是零
网格视图:
<asp:GridView ID="GridView2" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="Saved_Work" OnRowDataBound="update_url"
Style="float: left; font-size: small; position: relative;
width: 82%; position: relative; top: -10px; height: 40px; font-size: small; text-align: left;
left: 30px;" align="left">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:HyperLink ID="Continue_SavedWork" runat="server" NavigateUrl='<%# Eval("ID", "~/EditSavedJob.aspx?ID={0}") %>'
Text='<%# Eval("ID") %>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="UserID" HeaderText="User" SortExpression="UserID" />
<asp:BoundField DataField="Date_Created" HeaderText="Last_Updated_On" SortExpression="Date_Created" />
</Columns>
</asp:GridView>
后面的代码:
protected void update_url(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//string NavigateUrl="<%# Eval('ID', 'EditSavedTicket.aspx?ID={0}) %>";
string id = e.Row.Cells[0].Text;
HyperLink hp = (HyperLink)e.Row.FindControl("Continue_SavedWork");
if (SavedWorkDD.SelectedValue.ToString() == "Tickets")
hp.NavigateUrl = string.Format("EditSavedTicket.aspx?ID={0}", id);
}
}
我怀疑您无法访问第一列文本的原因是它是模板列,而其他列是 BoundField
列。
您可以在 OnRowUpdated
事件处理程序中访问 DataItem
,而不是从控件中检索文本。例如,如果您要绑定到 DataTable,则可以像这样访问 DataRowView
:
protected void update_url(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var row = (DataRowView)e.Row.DataItem;
var id = (int)row["ID"];
// ...
}
}
这种方法比尝试查找控件并访问它们的值更可靠。即使您更改 UI,它也会继续工作。