0

私はこのグリッドビューを持っています、それは2つの問題を抱えています。

  1. 列をクリックして並べ替えてからもう一度クリックすると、順序どおりに並べ替えられません。
  2. 一度aで並べ替えてcol Aから、他の列をクリックすると、再度並べ替えられませんか?

      <asp:GridView ID="grdReport" runat="server" AutoGenerateColumns="False" DataKeyNames="CustCode"
    ShowFooter="True" EmptyDataText="No record found" PageSize="50"
    CssClass="mGrid" onrowdatabound="grdReport_RowDataBound"
    AllowSorting="True" onsorting="grdReport_Sorting">
    <Columns>
       <asp:TemplateField HeaderText="Select">
            <ItemTemplate>
                <asp:CheckBox ID="chkSelect" runat="server"/>
            </ItemTemplate>
       </asp:TemplateField>
    
       <asp:TemplateField Visible="false">
       <ItemTemplate>
       <asp:Label ID="lblCustCodes" runat="server" Text='<%# Eval("CustCode") %>' CssClass="grdCustName"></asp:Label>
       </ItemTemplate>
       </asp:TemplateField>
    
      <asp:TemplateField HeaderText="Customer" SortExpression="Customer">
      <ItemTemplate>
       <asp:HyperLink Target="_blank" Text='<%# Eval("CustomerName") %>' runat="server" ID="hplNavigate">
       </asp:HyperLink>
       </ItemTemplate>
       </asp:TemplateField>
        <asp:BoundField DataField="QTY" HeaderText="Booked Qty" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"
            SortExpression="QTY">
            <FooterStyle HorizontalAlign="Right" />
            <ItemStyle HorizontalAlign="Right"></ItemStyle>
        </asp:BoundField>
           <asp:BoundField DataField="Volume" HeaderText="Booked Amt" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"
            SortExpression="Volume">
            <FooterStyle HorizontalAlign="Right" />
            <ItemStyle HorizontalAlign="Right"></ItemStyle>
        </asp:BoundField>
        </asp:BoundField>
         <asp:BoundField DataField="FirstBill" HeaderText="First Bill" HeaderStyle-HorizontalAlign="left" ItemStyle-HorizontalAlign="left"
            SortExpression="FirstBill">
            <FooterStyle HorizontalAlign="Left" />
            <ItemStyle HorizontalAlign="Left"></ItemStyle>
        </asp:BoundField>
    </Columns>
    <FooterStyle BackColor="Aqua" Font-Bold="true" ForeColor="BlueViolet"/>
    

ソートの背後にあるコードは

        switch (e.SortExpression)
        {
            case "Customer":
                if (e.SortDirection == SortDirection.Ascending)
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<string>("CustomerName")
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                else
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<string>("CustomerName") descending
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();   
                }                    
                break;

            case "QTY":
                if (e.SortDirection == SortDirection.Ascending)
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<int>("Qty")
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                else
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<int>("Qty") descending
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();   
                }                    
                break;

            case "Volume":
                if (e.SortDirection == SortDirection.Ascending)
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<float>("Volume")
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                else
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<float>("Volume") descending
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                break;

         case "FirstBill":
                if (e.SortDirection == SortDirection.Ascending)
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<DateTime>("FirstBill")
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                else
                {
                    var result = from table in Ob.DataTableOther.AsEnumerable()
                                 orderby table.Field<DateTime>("FirstBill") descending
                                 select table;
                    var dv = result.AsDataView();
                    grdReport.DataSource = dv;
                    grdReport.DataBind();
                }
                break;


            default:
                break;
        }

そして、行データバインドイベントは

 protected void grdReport_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        # region try
        try
        {
            if (e.Row.RowType == DataControlRowType.DataRow && Ob.DatasetMain.Tables[0].Rows.Count != 0)
            {
                if ((Ob.FromDate != null || Ob.FromDate != "") && (Ob.UptoDate != null || Ob.UptoDate != ""))
                {

                    ((HyperLink)e.Row.Cells[2].FindControl("hplNavigate")).NavigateUrl =
                       String.Format("~//Reports/BookingByCustomerReport.aspx?BC={0},{1},{2},{3}", Ob.DatasetMain.Tables[0].Rows[Ob.Counter][0], Ob.FromDate, Ob.UptoDate, radReportFrom.Checked);


                    Ob.Counter++;
                }
                if (hdnFromCustomer.Value == "true")
                {
                    ((CheckBox)e.Row.Cells[0].FindControl("chkSelect")).Checked = true;
                }
            }

            if (e.Row.RowType == DataControlRowType.Footer)
            {
                if (Ob.DatasetOther.Tables[0].Rows.Count != 0)
                {
                    e.Row.Cells[2].Text = "Total";
                    e.Row.Cells[3].Text = Ob.DatasetOther.Tables[0].Rows[Ob.DatasetOther.Tables[0].Rows.Count - 1][2].ToString();
                    e.Row.Cells[4].Text = Ob.DatasetOther.Tables[0].Rows[Ob.DatasetOther.Tables[0].Rows.Count - 1][3].ToString();
                    e.Row.Cells[5].Text = Ob.DatasetOther.Tables[0].Rows[Ob.DatasetOther.Tables[0].Rows.Count - 1][4].ToString();
                    e.Row.Cells[6].Text = Ob.DatasetOther.Tables[0].Rows[Ob.DatasetOther.Tables[0].Rows.Count - 1][5].ToString();
                }
            }
        }
        # endregion
        catch (Exception ex)
        { }
    }

問題を再度リストアップするには

  1. もう一度クリックすると、desで並べ替えることができません
  2. たとえば、顧客名で並べ替えてから、qtyまたはその他の[Specified cast is not valid.手段]をクリックすると、特定の列で並べ替えた後、他の列をクリックして並べ替えることができなくなります。

誰かが私が問題を理解するのを手伝ってくれる?

4

3 に答える 3

1

gridviewがgridviewプロパティでソートできるようにする必要があります

 AllowSorting="true" 

さらに、ソートをキャッシュ(ビューステートまたはセッション)に格納する必要があります。セッション変数を使用して最新のソート式を格納し、次にグリッドをソートするときに、グリッドのソート式を最後のソート式を格納するセッション変数と比較します。列が等しい場合は、前の並べ替えの方向を確認し、反対方向に並べ替えます。

例:

DataTable sourceTable = GridAttendence.DataSource as DataTable;
DataView view = new DataView(sourceTable);
string[] sortData = Session["sortExpression"].ToString().Trim().Split(' ');
if (e.SortExpression == sortData[0])
{
    if (sortData[1] == "ASC")
    {
        view.Sort = e.SortExpression + " " + "DESC";
        this.ViewState["sortExpression"] = e.SortExpression + " " + "DESC";
    }
    else
    {
        view.Sort = e.SortExpression + " " + "ASC";
        this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
    }
}
else
{
    view.Sort = e.SortExpression + " " + "ASC";
    this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
}
于 2012-08-25T10:13:01.820 に答える
1

グリッドでは、AutoGenerateColumns =“ false”の場合、e.SortDirectionは常に昇順になります。回避策は、ViewStateに列の最後の並べ替え順序を保存する(または各列の最後の並べ替え順序を保存する)必要があることです。

    public const string ASCENDING = "Ascending";
    public const string DESCENDING = "Descending";

SortOrderを保持するために、プロパティを定義します

    public string GridSortOrder
    {
        get { return Convert.ToString(ViewState["SortOrderKey"]) == string.Empty ? ASCENDING : "Descending"; }
        set { ViewState["SortOrderKey"] = value; }
    }

grdReport_Sortingイベントで、

     if (GridSortOrder == ASCENDING)
        {
            var result = from table in Ob.DataTableOther.AsEnumerable()
                         orderby table.Field<string>("CustomerName")
                         select table;
            var dv = result.AsDataView();
            grdReport.DataSource = dv;
            grdReport.DataBind();

        }
        else
        {
            var result = from table in Ob.DataTableOther.AsEnumerable()
                         orderby table.Field<string>("CustomerName") descending
                         select table;
            var dv = result.AsDataView();
            grdReport.DataSource = dv;
            grdReport.DataBind();   
        }

         /*
         * logic for remaining columns 
         */

        //Change the sortOrder
        ChangeSortOrder(GridSortOrder);

ソート順の変更方法

    public void ChangeSortOrder(string currentOrder)
    {
        GridSortOrder = currentOrder == ASCENDING ? DESCENDING : ASCENDING;
    }
于 2012-08-25T10:40:04.283 に答える
0

このアプローチを試してください

private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";
static private DataView dvReports;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // i am assuming that you are binding the gridview on page_load
        // you can use the same on a button click event too
        dvReports = new DataView(Ob.DataTableOther);
        BindGridView();
    }
}

protected void grdReport_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression = e.SortExpression;

    if (GridViewSortDirection == SortDirection.Ascending)
    {
        GridViewSortDirection = SortDirection.Descending;
        dvProducts.Sort = sortExpression + DESCENDING;
    }
    else
    {
        GridViewSortDirection = SortDirection.Ascending;
        dvProducts.Sort = sortExpression + ASCENDING;
    }
    BindGridView();
}

private void BindGridView()
{
    GridView1.DataSource = dvReports
    GridView1.DataBind();
}

public SortDirection GridViewSortDirection
{
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;

        return (SortDirection)ViewState["sortDirection"];
    }
    set { ViewState["sortDirection"] = value; }
}

あなたがそれをバインドしている場合、それを作成してカスタムソートを行うDataTable必要がないので、私はあなたのためにこれを書いています。IEnumerableこれは必須ではなく、さらに多くのコード行があります。

フレームワークはあなたの友達です。ハッピーコーディング。

于 2012-08-25T10:50:37.213 に答える