在Gridview的绑定字段上运行回调

时间:2012-01-18 14:36:06

标签: c# asp.net gridview visual-web-developer

我想处理从数据库中检索的字段,以便Gridview检查其中的信息是否是超链接。如果是,我想从中生成一个链接,否则只需将其保留为原始文本。目前,Gridview中的字段如下所示:

    <asp:TemplateField HeaderText="Reference">
        <EditItemTemplate>
            <asp:TextBox ID="txtReference" runat="server" Text='<%# Bind("Reference") %>'></asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Label3" runat="server" Text='<%# Bind("Reference") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

我尝试修改ItemTemplate的'Text'属性中的内容,但无论我放入什么,我都会在pageload上遇到错误。如何根据此字段中绑定的特定信息动态修改发送到浏览器的内容?

非常感谢!

3 个答案:

答案 0 :(得分:2)

如果绑定文字符合条件,您可以在Label中使用HyperLinkTemplateField并显示HyperLink(并隐藏Label)作为一个正确的URL。您可以使用代码隐藏函数执行此操作,该函数将bool返回到Visible属性,如下所示:

<强> ASP.NET

<asp:TemplateField HeaderText="Reference"> 
    <ItemTemplate> 
        <asp:Label ID="lbl" runat="server" Visible='<%# IsTextHyperlink(Eval("Reference")) %>' Text='<%# Bind("Reference") %>'/>
        <asp:HyperLink ID="hl" runat="server" Visible='<%# !IsTextHyperlink(Eval("Reference")) %>' NavigateUrl='<%# Bind("Reference") %>'/>
    </ItemTemplate> 
</asp:TemplateField> 

<强> C#

protected bool IsTextHyperlink(object text)
{
    bool IsHyperLink = false;
    ...
    // check if text qualifies as hyperlink
    ...
    return IsHyperLink ; 
}

注意使用类型object作为IsHyperLink函数参数,因为Eval()返回一个对象,只需将其强制转换为String。

您还希望将Text的{​​{1}}属性格式化为有意义的内容。

答案 1 :(得分:1)

您可以使用{/ 3}}方法,例如

protected virtual void yourGV_OnRowDataBound(object sender, gridViewRowEventArgs e)
{
   GridViewRow row = e.Row 
}

在内部,您可以使用GridView.OnRowDataBound访问行中的控件。

答案 2 :(得分:0)

我在Label中同时使用HyperLinkTemplateField来修复此问题,如果绑定显示HyperLink(隐藏Label)文本有资格作为正确的URL。

以下ASP.NET设置要输出的潜在HTML:

<强> ASP.NET

<asp:TemplateField HeaderText="Reference"> 
    <ItemTemplate>
                <asp:Label ID="lblReference" runat="server" Visible='<%# !isTextHyperlink(Eval("Reference")) %>' Text='<%# Bind("Reference") %>'/>
                <asp:HyperLink ID="hlReference" runat="server" Visible='<%# isTextHyperlink(Eval("Reference")) %>' Text='<%# Bind("Reference") %>' NavigateUrl='<%# Bind("Reference") %>'/>
    </ItemTemplate> 
</asp:TemplateField> 

我在页面'codebehind'中添加了一个函数,如下所示:

<强> C#

protected bool isTextHyperlink(object refobj)
{
    string refstring = refobj.ToString();
    try
    {
        Uri uri = new Uri(refstring);
        return Uri.CheckSchemeName(uri.Scheme);
    }
    catch
    {
        // not a valid uri (that Uri can construct with)
        return false;
    }
}

非常感谢Brissles提出的建议。