获取位于gridview中的模板字段内的超链接文本

时间:2013-08-09 17:30:48

标签: asp.net gridview hyperlink templatefield

似乎很容易,但我很难用这个。

    <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;
 }
                }

1 个答案:

答案 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");

一旦掌握了控制权,就可以将其投射到你需要的角色<或者它应该是