Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 获取位于gridview中模板字段内的超链接文本_Asp.net_Gridview_Hyperlink_Templatefield - Fatal编程技术网

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

Asp.net 获取位于gridview中模板字段内的超链接文本,asp.net,gridview,hyperlink,templatefield,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&

似乎很容易,但我有一个艰难的时间与此

    <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和在线的帮助)

超级链接=(超级链接)行。FindControl(“id”);//不起作用

((超链接)GridView1.Rows[i]。单元格[0]。控件[0])。文本//无效

这是我需要帮助的代码片段

            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;
                     }
                }
            }
for(int i=0;i
我使用button.CommandName来存储工作正常的ID字段。我只是在模板字段中的gridview中找不到超链接控件

我得到了以下错误,这对我来说没有意义

无法强制转换类型为“System.Web.UI.DataBoundLiteralControl”的对象 键入“System.Web.UI.WebControls.HyperLink”

更新1 如果我不使用超链接字段,这段代码可以顺利工作

 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;
                        }
                    }
for(int i=0;i
如果将列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;
 }
                }
for(int i=0;i
第一件事-您正在尝试
查找控件(“id”)设计视图中的控件实际上是
ID
-案例很重要

另一件事-这似乎也是因为
实际上不是一个
超链接
控件,而是一个
HtmlGenericControl
-因此尝试强制转换控件不会产生任何结果

您可以做两件事中的一件-更改代码以获得
HtmlGenericControl link=(HtmlGenericControl)row.FindControl(“ID”)

或者更改设计视图并使用
控件而不是HTML

您的错误
无法将类型为“System.Web.UI.DataBoundLiteralControl”(这是HTML术语中的
)的对象强制转换为类型为“System.Web.UI.WebControls.HyperLink”。

正在显示
((超链接)GridView1.Rows[i]。单元格[0]。控件[0]
在您处理的行的第一个单元格中,位置0处的控件是文本而不是链接。您可以通过查看控件[1]来尝试对其进行篡改

您可以查看表的呈现HTML并验证这一点-您的链接将嵌套在跨距中或跨距旁边

在调试中检查
控件
,查看其中实际包含的内容

更新

在如何调用代码方面存在很多困惑。您有
e.Row.RowType
,这让我相信您在
RowDataBound
中这样做

如果是这种情况,那么您不需要在每一行上调用此方法时遍历所有gridview行-因此您将调用每一行,然后调用网格中的每一行..对于一个大网格,大量的循环正在进行

所以试试这个,它只对那一行感兴趣

另外-不确定从何处获取
按钮.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
将只查看控件中的直接控件。它不会在控件中的控件中找到控件-即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
-不确定您使用的是小写还是大写-此方法将为您找出小错误:)


一旦你有了控制权,你就可以将它转换成你需要的/或者应该是

好的,ID实际上是其他的东西,所以这不是问题。我试过HTMLGenericControl,还是一样的问题。我更新了帖子中的错误消息。不过你猜得很好。如果你在第一次更新之前实现,那么你的另一个更新-顺便说一句-ID将是个问题。您不需要所有的单元格[0]内容……然后您会发现
ID
实际上是您的问题:)好的,同样的问题。以下是最新代码
对象引用未设置为对象实例的错误。我有小提琴
Control link = FindControlRecursive(row, "id");