3

指定した列に並べ替え機能を追加しようとしている編集可能な GridView があります。エラーは表示されませんが、並べ替え方法が機能しません。ここで欠けているものについて助けてもらえますか?

デザイン:

<asp:GridView ID="gvLogNotice" 
        runat="server" 
        AutoGenerateColumns="false" 
        ShowFooter="false"
        OnRowCancelingEdit="gvLogNotice_RowCancelingEdit"
        OnRowEditing="gvLogNotice_RowEditing" 
        OnRowUpdating="gvLogNotice_RowUpdating"
        EmptyDataText="There are no data records to display."
        DataKeyNames="LogNoticeID"
        AllowPaging="true"
        AllowSorting="true"
        OnSorting="gvLogNotice_sorting"
        Width="700px">
        <Columns>
            <asp:TemplateField HeaderText="Log No." Visible="false">
                <ItemTemplate>
                    <%#Eval("LogNoticeID")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogNoticeID" runat="server" Enabled="false" Text=' <%#Eval("LogNoticeID") %>'></asp:TextBox>
                </EditItemTemplate>
             </asp:TemplateField>
            <asp:TemplateField HeaderText="Log Date" SortExpression="DateLogged">
                <ItemTemplate>
                    <%#Eval("DateLogged")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtDateLogged" runat="server" Text=' <%#Eval("DateLogged") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Log Description" HeaderStyle-Width="50px" sortexpression="LogNoticeDescript">
                <ItemTemplate>
                    <%#Eval("LogNoticeDescript")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogNoticeDescript" runat="server" Text=' <%#Eval("LogNoticeDescript") %>'></asp:TextBox>
                </EditItemTemplate>
           </asp:TemplateField>
           <asp:TemplateField HeaderText="Responsible Party" sortexpression="ResponsibleParty">
                <ItemTemplate>
                    <%#Eval("ResponsibleParty")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtResponsibleParty" runat="server" Text=' <%#Eval("ResponsibleParty") %>'></asp:TextBox>
                </EditItemTemplate>
          </asp:TemplateField>
             <asp:TemplateField HeaderText="Planned Date" SortExpression="PlannedDate" >
                <ItemTemplate>
                    <%#Eval("PlannedDate")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtPlannedDate" runat="server" Text=' <%#Eval("PlannedDate") %>'></asp:TextBox>
              </EditItemTemplate>
          </asp:TemplateField>
           <asp:TemplateField HeaderText="Case Number" SortExpression="CaseNumber">
                <ItemTemplate>
                    <%#Eval("CaseNumber")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtCaseNumber" runat="server" Text=' <%#Eval("CaseNumber") %>'></asp:TextBox>
              </EditItemTemplate>
          </asp:TemplateField>
             <asp:TemplateField HeaderText="Log Status" SortExpression="LogStatus">
                <ItemTemplate>
                    <%#Eval("LogStatus")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtLogStatus" runat="server" Text=' <%#Eval("LogStatus") %>'></asp:TextBox>
                </EditItemTemplate>
          </asp:TemplateField>
            <asp:TemplateField HeaderText="Edit">
                <ItemTemplate>
                    &nbsp;&nbsp;
                    <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="images/edit.png" Width="25"
                        Height="25" CommandName="Edit" />&nbsp;&nbsp;
                   <%-- <asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/img/delete.png" CommandName="Delete"
                        OnClientClick="return confirm('Are you sure want to delete record?')" />--%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Update">Update</asp:LinkButton>&nbsp;&nbsp;
                    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
                </EditItemTemplate>
              </asp:TemplateField>
        </Columns>
    </asp:GridView>

コードビハインド:

//ページ読み込みイベント:

 protected void Page_Load(object sender, EventArgs e)
    {
        lblmsg.Text = "";
        if (!Page.IsPostBack)
        {
            gvLogNotice.ShowFooter = false;
            //Load grid data using common method
            LoadGrid();


        }
    }

// データを GV にバインドしてロードする

void LoadGrid()
        {
            sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
            sqlcmd.CommandType = CommandType.StoredProcedure;
            try
            {
                sqlcon.Open();
                da = new SqlDataAdapter(sqlcmd);
                dt.Clear();
                da.Fill(dt);
                gvLogNotice.DataSource = dt;
                gvLogNotice.DataBind();


            }
            catch (Exception ex)
            {

            }
            finally
            {
                sqlcon.Close();
            }
        }

//ソートイベント

  protected void gvLogNotice_sorting(object sender, GridViewSortEventArgs e)
    {
        switch (e.SortExpression)
        {
            case "DateLogged":
                if (e.SortDirection == SortDirection.Ascending)
                {
                   LoadGrid();
                }
                else
                {
                    LoadGrid();
                }

                break;

           }

    }
4

1 に答える 1

2

GridViewのSortDirectionプロパティは、GridView がDataSourceIDプロパティを使用して DataSource コントロールにバインドされている場合にのみ変更されます。それ以外の場合は、ソート方向を手動で管理する必要があります。

この場合、そのDataSourceプロパティを使用して gridView に Data を提供すると、e.SortDirection常に が返されAscendingます。したがって、IF ステートメントのみが常に実行されます。

2番目のポイント:: 実際に最適化する必要があるのは、データのみを返す関数を定義することだけです。たとえばLoadGrid()、DataTable のみを返すとします。この方法では、LoadGrid() メソッドのオーバーロードを定義する必要はありません。Morover、適切な実装方法があれば、オーバーロードはまったく必要ありません。

3 番目のポイント::並べ替えをまったく適用しておらず、GridView をロードしているだけです。DataSourceプロパティを設定して を呼び出して手動でデータバインドDataBind()する場合は、並べ替え操作を手動で処理する必要があります。

したがって、sortDirection を ViewState に格納することから始めます。同じものを取得/設定するパブリック プロパティを定義するだけです。[上記のポイント 1 に従って、sortDirection 値を保存する必要があることに注意してください]

public SortDirection SortDirection    
{ 
get { 
      if (ViewState["SortDirection"] == null)
            {
                ViewState["SortDirection"] = SortDirection.Ascending;
            }
        return (SortDirection)ViewState["SortDirection"];
     }
set
    {
           ViewState["SortDirection"] = value;
    }
}

あなたのOnSortingイベントでは、sortDirection最初にテーブルを並べ替えて、それをgridViewにロードします。

 protected void SortRecords(object sender, GridViewSortEventArgs e)
{
     string sortExpression = e.SortExpression;
     string direction = string.Empty;
        if (SortDirection == SortDirection.Ascending)
             {
                  SortDirection = SortDirection.Descending;
                  direction = " DESC";
             }
        else
            {
                 SortDirection = SortDirection.Ascending;
                 direction = " ASC";
            }
    DataTable table = this.LoadGrid(); // or this.GetDataTable(), to get only the DataTable
   // Now apply Sorting to your source of Data
    table.DefaultView.Sort = sortExpression + direction;
   // Bind the GridView
    gvLogNotice.DataSource = table;
    gvLogNotice.DataBind();
}

そして最後に、LoadGrid は問題ありません。テーブルを埋めて返すだけです。

private DataTable LoadGrid()
{
      DataTable dt = new DataTable();
      sqlcmd = new SqlCommand("selectActiveLogs", sqlcon);
      sqlcmd.CommandType = CommandType.StoredProcedure;
      try
       {
            sqlcon.Open();
            da = new SqlDataAdapter(sqlcmd);
            dt.Clear();
            da.Fill(dt);
            return dt;
       }
      catch (Exception ex)
       {}
}
于 2013-09-15T11:37:56.427 に答える