1

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。これは間違っています。行のタイプを詳細テーブルのタイプにする理由がわかりません。NominationDate は Nomination のプロパティです。データソースをオーバーライドしているようです。

私が達成しようとしているもののオンライン サンプルはありますか? アドバイスをいただければ幸いです。

4

1 に答える 1

1

少し突き出ていることの 1 つは、これが問題の原因であるかどうかはわかりませんが、具体的に DataSource を設定し、RadGrid の UpdateCommand イベント内で DataBind() を呼び出すことです。

まず第一に、RadGrid を更新するとき (まだ同じソースにバインドしている場合)、データ ソースを設定して .Databind() を呼び出す代わりに、.Rebind() 関数を呼び出すだけでよいはずです。

第二に、OnUpdateCommand は、特に呼び出す必要なく .Rebind() を呼び出す必要があり、それ (または上記で使用した方法) を使用すると、さまざまな奇妙な問題が発生する可能性があります。これが発生源になる可能性があります。

それとは別に、Telerikでサポート チケットを送信してみましたか? この問題を処理するには、彼らのサポート チームが最善の策であると信じています。

于 2011-03-09T17:16:06.630 に答える