Как преобразовать BoundField в HyperLinkField? - PullRequest
3 голосов
/ 19 августа 2011

У меня есть GridView (gv), связанный с набором данных (ds).Columns[1] привязан к полю в ds с именем orderFilename;Columns[6] - поле даты.

Если Columns[6] равно нулю, я хочу, чтобы Columns[1] отображался как текст;если Columns[6] не равно NULL, я хочу, чтобы Columns[1] отображался в виде гиперссылки с URL-адресом ~/directory/ + orderFilename.

В Интернете я нашел несколько возможных решений, но, похоже, ни одноделай что я хочу.Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Я предпочитаю держаться подальше от BoundFields специально, потому что следующий парень всегда должен конвертировать их в поля шаблона в любом случае для настройки. Я бы порекомендовал следующее:

Используйте поле шаблона с элементом управления Literal для столбца 1:

<asp:TemplateField HeaderText="File">
    <ItemTemplate>
        <asp:Literal ID="ltFilename" runat="server" 
            OnDataBinding="ltFilename_DataBinding" />
   </ItemTemplate>
</asp:TemplateField>

Затем реализуйте OnDataBinding для элемента управления столбцами:

protected void ltFilename_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    if (Eval("yourColumn6Field") == DBNull.Value)
    {
        // just show a text filename
        lt.Text = Eval("orderFilename").ToString();
    }
    else
    {
        // produce the link
        lt.Text = string.Format("<a href='{0}'>{1}</a>",
             ResolveUrl("~/directory/" + Eval("orderFilename").ToString()),
             Eval("orderFilename").ToString());
    }
}

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

1 голос
/ 19 августа 2011

Допустим, вы добавили элемент управления гиперссылкой в ​​column[1]. Если column[6] не равно нулю, вы можете установить свойство NavigateURL и указать URL-адрес. В этом случае он будет выглядеть как гиперссылка, а если column[6] is null, то вам не нужно указывать URL, так как он будет вести себя как текст.

0 голосов
/ 19 августа 2011

Используйте столбец шаблона и поместите в него две панели. Одна панель содержит ссылку, а другая - текст. Попробуйте что-то вроде этого:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Panel ID="pnlLink" runat="server" Visible='<%#Eval("SomeColumn") != null%>'>
             <asp:HyperLink ... ></asp:HyperLink>
        </asp:Panel>
        <asp:Panel ID="pnlLink" runat="server" Visible='<%#Eval("SomeColumn") = null%>'>
             <%#Eval("SomeColumn")%>
        </asp:Panel>
    </ItemTemplate>
</asp:TemplateField>

Другой вариант, как предложил @Muhammad Akhtar, заключается в том, чтобы использовать гиперссылку независимо и устанавливать URL-адрес только тогда, когда DataField для столбца [6] не равен нулю.

...