Telerik grid с полем подтверждения JavaScript для обновления столбца - PullRequest
1 голос
/ 08 марта 2011

У меня есть сетка Telerik. Для каждой строки есть таблица данных. Строка имеет тип NominationTypeClass, а строки в таблице сведений имеют тип Nomination. Так что это означает для каждого типа номинации есть список номинаций. Код сетки:

<telerik:RadGrid
   AllowPaging="true"
   AllowSorting="true"
   AutoGenerateColumns="false"
   GridLines="None"
   ID="rgMyNominations"
   OnDetailTableDataBind="rgMyNominations_DetailTableDataBind"
   OnItemDataBound="rgMyNominations_ItemDataBound"
   OnNeedDataSource="rgMyNominations_NeedDataSource"
   OnUpdateCommand="rgMyNominations_UpdateCommand"
   PageSize="5"
   runat="server"
   ShowHeader="false"
   ShowStatusBar="true">
   <MasterTableView DataKeyNames="NominationTypeID" HierarchyDefaultExpanded="true" Width="100%">
      <Columns>
         <telerik:GridTemplateColumn>
            <ItemTemplate>
               <b><asp:Label ID="lblNominationType" runat="server" Text='<%# DataBinder.Eval( Container, "DataItem.NominationType") %>' /></b>
            </ItemTemplate>
            <ItemStyle Width="100%" />
         </telerik:GridTemplateColumn>
      </Columns>
      <NoRecordsTemplate>No Nomination Types.</NoRecordsTemplate>
      <DetailTables>
         <telerik:GridTableView PageSize="5" Name="Nominations" GridLines="None" Width="100%" ShowHeader="true" DataKeyNames="NominationID">
            <Columns>
               <telerik:GridTemplateColumn HeaderText="Person / Team">
                  <ItemTemplate>
                     <asp:Label ID="lblName" runat="server" Text='<%# GetName(DataBinder.Eval(Container, "DataItem")) %>' />
                  </ItemTemplate>
                  <ItemStyle VerticalAlign="Top" Width="20%" />
               </telerik:GridTemplateColumn>
               <telerik:GridTemplateColumn HeaderText="Date Nominated">
                  <ItemTemplate>
                     <asp:Label ID="lblNominationDate" runat="server" Text='<%# FormatDate(DataBinder.Eval(Container, "DataItem.NominationDate")) %>' />
                  </ItemTemplate>
                  <ItemStyle VerticalAlign="Top" Width="14%" />
               </telerik:GridTemplateColumn>
               <telerik:GridTemplateColumn HeaderText="Action" UniqueName="Action_Column">
                  <ItemTemplate>
                     <b><asp:HyperLink ID="hlEdit" runat="server" Text="Edit" /></b><br />
                     <b>
                        <asp:LinkButton
                           CausesValidation="false"
                           CommandName="Update"
                           ID="lbWithdrawnStatus"
                           runat="server"
                           Text="Withdraw"
                           OnClientClick="javascript:return ConfirmWithdrawnStatusChange();" />
                     </b>
                  </ItemTemplate>
                  <ItemStyle VerticalAlign="Top" Width="7%" />
               </telerik:GridTemplateColumn>
            </Columns>
            <NoRecordsTemplate>No Nominations.</NoRecordsTemplate>
         </telerik:GridTableView>
      </DetailTables>
   </MasterTableView>
   <ClientSettings AllowExpandCollapse="true"></ClientSettings>
</telerik:RadGrid>

Вот как я заполняю свои строки:

protected void rgMyNominations_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
{
   try
   {
      if (!e.IsFromDetailTable)
      {
         rgMyNominations.DataSource = GetNominationTypes();
      }
   }
   catch (Exception ex)
   {
      // Handle exceptions
   }
}

Вот как я заполняю свою таблицу данных:

protected void rgMyNominations_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e)
{
   try
   {
      GridDataItem gridDataItem = (GridDataItem)e.DetailTableView.ParentItem;
      if (e.DetailTableView.Name == "Nominations")
      {
         int nominationTypeID = int.Parse(gridDataItem.GetDataKeyValue("NominationTypeID").ToString());

         List<Nomination> nominations = new List<Nomination>();

         // For each nomination type, add the nomination
         foreach (Nomination n in myNominationsList)
         {
            if (n.NominationType.NominationTypeID == nominationTypeID)
            {
               nominations.Add(n);
            }
         }

         e.DetailTableView.DataSource = nominations;
      }
   }
   catch (Exception ex)
   {
      // Handle exceptions
   }
}

У меня есть столбец действий, в котором есть ссылка «Снято». При нажатии у меня появляется JavaScript confirm box с опцией Да или Нет. Если да, то nomination status is updated to withdrawn. Затем я хочу обновить сетку, чтобы показать обновленный статус. Я использовал команду обновления сетки для отображения окна команд JavaScript. Это обновляет, но это правильный способ сделать это?

protected void rgMyNominations_UpdateCommand(object source, GridCommandEventArgs e)
{
   try
   {
      StatusManager.InsertStatus( /* required parameters */ );

      // Refresh grid
      rgMyNominations.DataSource = GetNominationTypes();
      rgMyNominations.DataBind();
   }
   catch (Exception ex)
   {
      // Handle exceptions
   }
}

Привязка сетки не хочет работать должным образом после обновления статуса. Строка сетки имеет тип NominationTypeClass, а таблица сведений имеет тип Nomination. Я отладил, и там, где он установил источник данных для каждого, это правильно, но когда представление отображается для:

<asp:Label ID="lblNominationDate" runat="server" Text='<%# FormatDate(DataBinder.Eval(Container, "DataItem.NominationDate")) %>' />

... говорится, что NominationDate не является свойством NominationTypeClass. Это неправильно, я не знаю, почему в качестве типа таблицы данных выбран тип строки? НоминацияДата является собственностью Номинации. Кажется, что он переопределяет источники данных.

Есть ли в сети образцы того, чего я пытаюсь достичь? Любой совет будет оценен.

1 Ответ

1 голос
/ 09 марта 2011

Одна вещь, которая немного выделяется, и я не уверен, что именно в этом и состоит проблема, заключается в том, что вы специально устанавливаете DataSource и вызываете DataBind () в событии UpdateCommand RadGrid.

Прежде всего, при обновлении RadGrid (если вы все еще привязываетесь к тому же источнику), вам нужно всего лишь вызвать функцию .Rebind () вместо того, чтобы устанавливать источник данных и вызывать .Databind ()

Во-вторых, OnUpdateCommand должен вызывать .Rebind () без необходимости его конкретного вызова, и использование этого (или метода, который вы используете выше) может привести к различным странным проблемам.Это может быть потенциальный источник.

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

...