JQGrid: раскрывающийся список для выбора элементов из сторонней таблицы — DataValueField против DataTextField

Предположим, что ItemID и ItemTypes имеют числовые первичные ключи ItemID и ItemTypeID. Каждому элементу назначается тип элемента.

У меня есть JQGrid для редактирования элементов. Когда я не в режиме редактирования, я хотел бы видеть имя ItemType, а не ItemTypeID:

    TYPE       | TITLE
    -----------+--------------------
    Category A | Item 1
    Category A | Item 2
    Category B | Item 3
    Category B | Item 4

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

Вот что у меня есть (используя оболочку ASP.NET для JQGrid):

<trirand:jqgrid id="Grid1" runat="server" ... >
    <columns>
        <trirand:jqgridcolumn datafield="ItemID" editable="false" visible="false" width="50" primarykey="true" />
        <trirand:jqgridcolumn datafield="ItemTypeID" editable="true" edittype="DropDown" editorcontrolid="ItemTypes" />
        <trirand:jqgridcolumn datafield="Title" editable="true" sortable="true" />
        ...
    </columns>
</trirand:jqgrid>
<asp:sqldatasource runat="server" id="ItemTypesDatasource" connectionstring="<%$ ConnectionStrings:Main %>" selectcommand="Select ItemTypeID,Title from ItemTypes order by Title" />
<asp:dropdownlist runat="server" id="ItemTypes" datasourceid="ItemTypesDatasource" datavaluefield="ItemTypeID" datatextfield="Title" />

Проблема в том, что когда он не находится в режиме редактирования, он отображает числовой ItemTypeID, а не текстовые метки:

    TYPE       | TITLE
    -----------+--------------------
    100123     | Item 1
    100123     | Item 2
    100124     | Item 3
    100124     | Item 4

Есть ли способ заставить JQGrid уважать различие между DataValueField и DataTextField? (Либо с помощью jQuery API, либо с помощью подключаемого модуля ASP.NET.)


person Herb Caudill    schedule 21.12.2009    source источник


Ответы (3)


Для тех, кто использует javascrpt, а не оболочку asp.net, способ javascript использует форматирование и неформатирование:

модель колонки:

editoptions: {значение: '1: Type1; 2: Type2; 3: Type3; 4: Type4; 5: Type5'}, форматер: showTextFmatter, неформат: unformatShowText,

мой форматер, вы должны написать свой собственный, как показано ниже:

    function showTextFmatter (cellvalue, options, rowObject)   
    {  
       var vts={};
       if(options.colModel.editoptions.values==undefined)
       {
           vtStr = options.colModel.editoptions.value.split(';');
           for(var i =0;i<vtStr.length;i++)
           {
              kv = vtStr[i].split(':');
              vts[kv[0]]=vtStr[i]; 
           }
           options.colModel.editoptions.values = vts;
       }
       return options.colModel.editoptions.values[cellvalue];   
    }   
    function  unformatShowText (cellvalue, options)   
    { 
       return cellvalue.split(':')[0];  
    }  
person Bili    schedule 03.05.2010

Здесь нашел хорошее решение: http://www.trirand.net/forum/default.aspx?g=posts&t=168

Идея состоит в том, чтобы обработать событие CellBinding в сетке и найти текст, соответствующий идентификатору, который содержит ячейка.

protected void JQGrid1_CellBinding(object sender, Trirand.Web.UI.WebControls.JQGridCellBindEventArgs e)
   {
      if (e.ColumnIndex == 1) // index of your dropdown column
      {
         e.CellHtml = LookupText(e.CellHtml);
      } 
   }

Реализация LookupText будет зависеть от вашей ситуации; вы можете просмотреть столбец EditValues (например, 1:One;2:Two;3:Three) или найти его в своих данных.

Я обернул всю эту логику в пользовательский класс столбца (в VB.NET), который также заполняет раскрывающийся список на основе команды SQL, которую вы ему даете.

Public Class JqGridDropDownColumn
    Inherits Trirand.Web.UI.WebControls.JQGridColumn

    Private _SelectCommand As String
    '' /* The SQL command used to populate the dropdown. */
    '' /* We assume that the first column returned contains the value (e.g. BudgetID)  and the second column contains the text (e.g. Title). */
    Public Property SelectCommand() As String
        Get
            Return _SelectCommand
        End Get
        Set(ByVal value As String)
            _SelectCommand = value
        End Set
    End Property

    Private _DropDownNullText As String
    Public Property DropDownNullText() As String
        Get
            Return _DropDownNullText
        End Get
        Set(ByVal value As String)
            _DropDownNullText = value
        End Set
    End Property

    Private WithEvents Grid As JQGrid
    Private DropDownValues As DataTable

    Sub Init(g)
        Grid = g
        DropDownValues = ExecuteDataset(cs, CommandType.Text, Me.SelectCommand).Tables(0)
        DropDownValues.PrimaryKey = New DataColumn() {DropDownValues.Columns(0)}
        Me.EditValues = BuildEditValues(DropDownValues)
    End Sub

    '' /* Builds a string of the form "1:One;2:Two;3:Three" for use by the EditValues property. */
    '' /* This assumes that Table consists of two columns corresponding to the Value (e.g. BudgetID) and Text (e.g. Title), in that order. */ 
    Protected Function BuildEditValues(ByVal Table As DataTable) As String
        Dim Result As String = ""
        If Not String.IsNullOrEmpty(Me.DropDownNullText) Then
            Result = String.Format(":{0}", Me.DropDownNullText)
        End If
        For Each Row As DataRow In Table.Rows
            If Len(Result) > 0 Then Result &= ";"
            Result &= Row(0) & ":" & Row(1)
        Next
        Return Result
    End Function


    Private Sub Grid_CellBinding(ByVal sender As Object, ByVal e As Trirand.Web.UI.WebControls.JQGridCellBindEventArgs) Handles Grid.CellBinding
        '' /* Display the text (e.g. Title) rather than the value (e.g. BudgetID) */
        If Grid.Columns(e.ColumnIndex) Is Me Then
            e.CellHtml = LookupText(e.CellHtml)
        End If
    End Sub

    Private Function LookupText(ByVal Value As String) As String
        Dim MatchingRow As DataRow = DropDownValues.Rows.Find(Value)
        If MatchingRow IsNot Nothing Then
            Return MatchingRow(1) '' /* Column 1 is assumed to contain the text */
        Else
            Return ""
        End If
    End Function
End Class

Вам просто нужно вызвать DropdownColumn.Init(MyGrid) для этого столбца из события Grid init. Надеюсь, это поможет кому-то.

person Herb Caudill    schedule 02.03.2010

Херб, проблема в том, что вы используете datafield="ItemTypeID". Вы должны изменить его на что-то вроде CategoryTitle.

Вот также пример http://www.trirand.net/examples/editing_data/edit_types/default.aspx

person João Guilherme    schedule 06.01.2010
comment
Пожалуйста, перечитайте вопрос - это не очень помогает. Проблема в том, что я хочу сохранить идентификатор (например, ItemTypeID), но отобразить имя (например, заголовок) - person Herb Caudill; 02.03.2010