Выполнить обратный вызов в связанных полях Gridview - PullRequest
3 голосов
/ 18 января 2012

Я хочу обработать поле, полученное из базы данных для 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>

Я пытался изменить то, что находится в атрибуте 'Text' ItemTemplate, но независимо от того, что я вставил, я получаю ошибки при загрузке страницы. Как я могу динамически изменить то, что отправлено в браузер, на основе конкретной информации, связанной в этом поле?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Вы можете использовать и Label и HyperLink в своем TemplateField и показать HyperLink (и скрыть Label), если связанный текст квалифицируется как правильный URL.Это можно сделать с помощью функции codebehind, которая возвращает значение 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 ; 
}

Обратите внимание, что для параметра функции IsHyperLink используется тип object, так как Eval () возвращает объект, просто приведите его к String.

Вы также хотите отформатировать Text свойство вашего HyperLink во что-то значимое.

1 голос
/ 18 января 2012

Вы можете использовать метод GridView.OnRowDataBound , например

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

внутри, вы можете получить доступ к элементам управления в строке, например, с помощью FindControl.

0 голосов
/ 19 января 2012

Я исправил это, используя Label и HyperLink в моем TemplateField, показывая 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 за предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...