ASP.net 2.0 GridView Столбцы зависят от нескольких столбцов в связанном наборе результатов - PullRequest
2 голосов
/ 12 ноября 2008

Я работаю с элементом управления ASP.net 2.0 GridView, который привязан к результатам SQL-запроса, поэтому он выглядит примерно так:

<asp:GridView ID="MySitesGridView" runat="server" AutoGenerateColumns="False" DataSourceID="InventoryDB" AllowSorting="True" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowCommand="GridView1_RowCommand" OnRowDataBound="siteRowDataBound">
        <Columns>
            <asp:BoundField DataField="Server" HeaderText="Server"/>
            <asp:BoundField DataField="Customer" HeaderText="Customer" SortExpression="Customer" />
            <asp:BoundField DataField="PublicIP" HeaderText="Site Address" DataFormatString="&lt;a href='http://{0}/foo'&gt;Go To Site&lt;/a&gt;" />
        </Columns>
</asp:GridView>

Как видите, я отображаю ссылки с адресами в одном из столбцов (тот, который связан с полем PublicIP), используя строку формата:

&lt;a href='http://{0}/foo'&gt;Go To Site&lt;/a&gt;

Вот проблема: мне нужно использовать один из других столбцов из набора результатов, а также столбец PublicIP в моих ссылках, но я не знаю, как сделать это доступным для моего формата строка. По сути, мне нужно, чтобы этот столбец был привязан к двум столбцам из набора результатов. Чтобы уточнить, мне нужно что-то вроде:

&lt;a href='http://{0}/{1}'&gt;Go To Site&lt;/a&gt;

Где {1} - это значение моего другого столбца. Есть ли способ сделать это чисто (даже если он не использует строки формата)? Я также рассмотрел использование TemplateFields, но не вижу и простого способа сделать это с ними.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2008

Шаблонные поля - путь.

Я обычно предпочитаю иметь функцию частной строки на странице, в которой я передаю несколько переменных объекта и вычисляю полученную строку.

<a href="<%# CalculateUrl(Eval("PublicIP"), Eval("Customer")) %>">site</a>

и в коде позади:

private string CalculateUrl(object PublicIP, object Customer)
{
    if (PublicIP==null || PublicIP==DBNull.Value)
        return "";
    if (Customer==null || Customer==DBNull.Value)
        return "";
    return "http://" + PublicIP.ToString() + "/" + Customer.ToString();
}

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

1 голос
/ 12 ноября 2008

Вы пробовали TemplateField в сочетании с Eval?

<asp:TemplateField>
    <ItemTemplate>
        <a href='<%#Eval("PublicIP")/<%# Eval("Customer") %>'>Go to site</a>
    </ItemTemplate>
</asp:TemplateField>
0 голосов
/ 12 ноября 2008

Если вам нужна фактическая ссылка, вы также можете использовать HyperLinkField, который имеет свойство DataNavigateUrlFields (множественное число), которое можно использовать для указания нескольких полей. Затем вы устанавливаете DataNavigateUrlFormatString на что-то, содержащее {0}, {1} и т. Д. Это станет вашей ссылкой. Для текста ссылки вы используете DataTextFormatString и DataTextField (единственное, не спрашивайте меня, почему). Это, вероятно, немного проще, чем TemplateField (хотя и менее гибкий).

...