gridview отображает текст вместо значений - PullRequest
4 голосов
/ 15 июля 2011

мой вопрос:

моя таблица состоит из следующих значений: 0, 1, 2 3

, но когда загружается сетка, я хочу, чтобы текст отображался вместо этих цифр.

0 = not set, 1 = low, 2 = medium, 3 = high

я мог бы сделать это как условие if / else, но я просто хотел найти оптимизированный sol.

вот мой обзор сетки разметки:

<asp:TemplateField  HeaderText="Priority" SortExpression="Priority" >
<ItemTemplate>
 <asp:Label ID="lblPriority" Text='<%# DataBinder.Eval(Container.DataItem,"Priority")%>' runat="server" />
 </ItemTemplate>

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Почему бы не использовать перечисления? Здесь:

Имейте перечисление под названием Приоритет. Затем поместите атрибут Description в каждый из них и напишите отображаемый текст внутри конструктора этого атрибута.

public enum Priority
{
    [Description("not set")]
    NotSet = 0,
    [Description("low")]
    Low = 1,
    [Description("medium")]
    Medium = 2,
    [Description("high")]
    High = 3
}

Затем используйте метод Enum.ToObject для преобразования чисел (значений) в соответствующие отображаемые значения с помощью следующих функций:

    // An extension method for ease of use that converts an integer into enum
    public static T ToEnum<T>(this int value)
    {
        if (typeof(T).BaseType.Name != typeof(Enum).Name)
        {
            throw new Exception("Input type of generic method ToEnum<T>() is not an Enum");
        }
        return (T)Enum.ToObject(typeof(T), value);
    }

    // Another extension method that gets the display text of the Description attribute of a given enum constant
    public static string GetDescription(this Enum value)
    {
        return ((DescriptionAttribute)value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false)[0]).Description;
    }

Тогда в своем коде вы можете написать:

databaseValue.ToEnum<Priority>().GetDescription();
3 голосов
/ 15 июля 2011

Предполагая, что у вас нет отображаемых значений в БД, это способ реализации части рендеринга. Может быть более удобный способ хранения значений поиска, если кто-то может внести свой вклад, я был бы признателен.

Я написал это в блокноте, поскольку у меня на компьютере нет Visual Studio. Пожалуйста, извините, если есть какие-либо синтаксические ошибки.

Markup:

<asp:Label ID="lblPriority" Text='<%# RenderPriority(DataBinder.Eval(Container.DataItem,"Priority")) %>' runat="server" />

Код:

Protected Function RenderPriority(ByVal dbValue As Object) As String
    Dim strReturn as String = String.Empty
    If Not IsDbNull(dbValue) Then
        Dim intValue as Integer
        If Integer.TryParse(dbValue, intValue) Then
            Select Case intValue
                Case 0
                    strReturn = "not set"
                Case 1
                    strReturn = "low"
                Case 2
                    strReturn = "medium"
                Case 3
                    strReturn = "high"
            End Select
        Else
            strReturn = dbValue.ToString()
        End If
    End If
    Return strReturn
End Function

Edit:

После перечитывания вашего вопроса у меня сложилось впечатление, что вы предпочли бы избегать написания определенной функции для этой цели на странице кода кода. Если это так, вам, вероятно, следует сохранить строки, которые вы хотите связать со значениями ключей, в БД и извлечь их с помощью оператора SQL. Или, по крайней мере, протолкнуть функциональность на уровень доступа к данным. В любом случае, в идеале столбец GridView будет представлен требуемой строкой в ​​соответствии с источником данных.

2 голосов
/ 15 июля 2011

Вы можете использовать событие RowDataBound GridView и установить значение для определенного условия.

Вот полный код ....

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        System.Data.DataRow dr = ((System.Data.DataRowView)e.Row.DataItem).Row;

        if (dr["Priority"].ToString() == "0")
        {
            ((Label)e.Row.FindControl("lblPriority")).Text = "not set";
        }
        else if (dr["Priority"].ToString() == "1")
        {
            ((Label)e.Row.FindControl("lblPriority")).Text = "low";
        }
        else if (dr["Priority"].ToString() == "2")
        {
            ((Label)e.Row.FindControl("lblPriority")).Text = "medium";
        }
        else if (dr["Priority"].ToString() == "3")
        {
            ((Label)e.Row.FindControl("lblPriority")).Text = "high";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...