似乎很容易,但我很难用这个。
<asp:TemplateField HeaderText="ID" InsertVisible="False" SortExpression="id">
<ItemTemplate>
<a href="/visit.aspx?Id=<%#Eval("Id")%>" id="ID" name="ID"> <%#Eval("Id")%> </a>
</ItemTemplate>
</asp:TemplateField>
gridview的最后一列有一个按钮。单击此按钮可更新数据库并刷新gridview。它还会查看gridview中的id列,并尝试突出显示已编辑的行。
如果ID字段是有界字段且不是URL,则代码可以正常工作。但是当它是一个URL时,我似乎无法读取URL的文本值。我尝试了各种解决方案(SO和在线帮助)
HyperLink link =(HyperLink)row.FindControl(“id”); //没用?
((HyperLink)GridView1.Rows [i] .Cells [0] .Controls [0])。text //无法正常工作
这是我需要帮助的代码片段
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
if (row.RowType == DataControlRowType.DataRow)
{
HyperLink link = (HyperLink)row.FindControl("id");
if (((HyperLink)GridView1.Rows[i].Cells[0].Controls[0]).Text == button.CommandName)
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}
}
我使用button.CommandName来存储工作正常的ID字段。我似乎无法在模板字段中的gridview中找到超链接控件。
我收到以下错误,对我来说没有意义
无法转换'System.Web.UI.DataBoundLiteralControl'类型的对象 输入'System.Web.UI.WebControls.HyperLink'。
UPDATE1 如果我不使用超链接字段,此代码无故障地工作。
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
if (row.Cells[0].Text.Equals(button.CommandName))
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}
如果将列0更改为超链接并更改相应的代码,则它不起作用。显然,阅读错误的单元格不是问题。
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
HtmlAnchor anchor = (HtmlAnchor) row.Cells[0].Controls[0];
if ( anchor.InnerText.Equals(button.CommandName))
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}
答案 0 :(得分:2)
首先要做的事情 - 您正试图FindControl("id");
设计视图中的控件实际上是ID
- 案例很重要。
另一件事 - 这似乎也是因为<a>
实际上不是HyperLink
控件,而实际上是HtmlGenericControl
- 因此试图施放你的控件并不会产生任何结果。< / p>
您可以执行以下两项操作之一 - 更改代码隐藏以获取HtmlGenericControl link = (HtmlGenericControl )row.FindControl("ID");
或者更改您的设计视图并使用<asp:Hyperlink>
控件而不是HTML <a>
您的错误Unable to cast object of type 'System.Web.UI.DataBoundLiteralControl' (which is a
in HTML terms) to type 'System.Web.UI.WebControls.HyperLink'.
说((HyperLink)GridView1.Rows[i].Cells[0].Controls[0]
你处理的行上第一个单元格中位置0的控件是文字而不是链接。您可以尝试通过查看Controls [1]来捏造它。
您可以查看表格的呈现HTML并验证这一点 - 您的链接将嵌套在一个范围内,或者在一个范围旁边。
检查调试中的Controls
并查看其中实际包含的内容。
<强>更新强>
对于您调用代码的方式存在很多困惑。您e.Row.RowType
让我相信您在RowDataBound
中执行此操作。
如果是这种情况,那么你不需要遍历所有的gridview行,因为这个方法在每一行都被调用 - 所以你要调用每一行,然后调用网格中的每一行。大量的循环继续大网格。
所以试试这个 - 它只对那一行感兴趣。
也 - 不确定你在哪里;从
获取button.CommandName
为此,您需要检查FindControl方法以确保它实际上是一个超链接控件
if ((e.Row.RowType == DataControlRowType.DataRow)) {
GridViewRow row = e.Row;
// get your link - if indeed the control IS a hyperlink
// this will be null if the control "id" is NOT a hyperlink control
HyperLink link = (HyperLink)row.FindControl("id");
if ((link.Text == Button.CommandName)) {
row.BackColor = Drawing.Color.IndianRed;
}
}
上次更新...
好的 - 经过更多评论我认为你需要递归搜索控件。这是因为FindControl
只会查看控件中的直接控件。它不会在你控制范围内的控件中找到控件--I.E FindControl只查看第一个孩子,而不是孙子。
因此,您可以随意创建此方法:
public static Control FindControlRecursive(Control Root, string Id)
{
if (Root.ID == Id) { return Root; }
foreach (Control Ctl in Root.Controls)
{
Control FoundCtl = FindControlRecursive(Ctl, Id);
if (FoundCtl != null) { return FoundCtl; }
}
return null;
}
然后传递你的行和你正在寻找的控件的ID。
所以这样 - 改变:
HyperLink link = (HyperLink)row.FindControl("id");
对此 - 注意我保留了你的小写id
- 不确定你是使用小写还是大写 - 这种方法会为你找出小虫子:)
Control link = FindControlRecursive(row, "id");
一旦掌握了控制权,就可以将其投射到你需要的角色<或者它应该是