Gridview Сортировка, обновление и редактирование - PullRequest
0 голосов
/ 24 декабря 2009

сезонов привет всем вам. Мне действительно нужна помощь, потому что это сводит меня с ума.

Цель. У меня есть текстовое поле, в которое клиент вводит число, они щелкают по списку переключателей, чтобы выбрать материал, и нажимают кнопку, чтобы заполнить сетку.

Это код переднего конца:

<asp:TextBox ID="tbxHowMany" runat="server" 
        style="z-index: 1; left: 300px; top: 250px; position: absolute"></asp:TextBox>

    <asp:Button ID="btnDisplayTopReport" runat="server" 
        style="z-index: 1; left: 645px; top: 285px; position: absolute; height: 25px; width: 170px" 
        Text="Display TOP Report" onclick="btnDisplayTopReport_Click" />

    <asp:RadioButtonList ID="radTOP" runat="server" 
        style="z-index: 1; left: 575px; top: 180px; position: absolute; height: 177px; width: 86px">
        <asp:ListItem>Paper</asp:ListItem>
        <asp:ListItem>Glass</asp:ListItem>
        <asp:ListItem>Aluminium</asp:ListItem>
        <asp:ListItem>Steel</asp:ListItem>
        <asp:ListItem>Plastic</asp:ListItem>
        <asp:ListItem>Wood</asp:ListItem>
        <asp:ListItem>Other</asp:ListItem>
    </asp:RadioButtonList>

    <asp:LinqDataSource ID="LQTOPReportDS" runat="server" 
        ContextTypeName="CompleteWeightsDataContext" 
        EnableUpdate="True" TableName="tblOnlineReportingCOMPLETEWeights"
        Where="IDDesc == @IDDesc && UnitUserfield1 == @UnitUserfield1 && UnitUserfield2 == @UnitUserfield2 && MaterialLevel == @MaterialLevel"
        OrderBy="UnitId, MaterialLevel, MaterialText, UnitWeight"
        StoreOriginalValuesInViewState="True">
    </asp:LinqDataSource>

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" 
        DataKeyNames="PriKey" DataSourceID="LQTOPReportDS" ForeColor="#333333" 
        GridLines="None"  Font-Size="X-Small" 
        style="z-index: 1; left: 5px; top: 375px; position: absolute; height: 133px; width: 187px" 
        onpageindexchanging="GridView1_PageIndexChanging" 
            onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating" 
            onsorting="GridView1_Sorting">
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
        <Columns>
            <asp:CommandField ShowEditButton="True" />
           <asp:BoundField DataField="UnitId" HeaderText="UnitId" 
                SortExpression="UnitId" />
            <asp:BoundField DataField="UnitDescription" HeaderText="UnitDescription" 
                SortExpression="UnitDescription" />
            <asp:BoundField DataField="PackagingGroupId" HeaderText="PackagingGroupId" 
                SortExpression="PackagingGroupId" />
            <asp:CheckBoxField DataField="IsPackagingGroup" HeaderText="IsPackagingGroup" 
                SortExpression="IsPackagingGroup" />
            <asp:BoundField DataField="PackagingTypeCode" HeaderText="PackagingTypeCode" 
                SortExpression="PackagingTypeCode" />
            <asp:BoundField DataField="UnitWeight" HeaderText="UnitWeight" 
                SortExpression="UnitWeight" />
            <asp:BoundField DataField="WeightUnitCode" HeaderText="WeightUnitCode" 
                SortExpression="WeightUnitCode" />
            <asp:BoundField DataField="MaterialLevel" HeaderText="MaterialLevel" 
                SortExpression="MaterialLevel" />
            <asp:BoundField DataField="MaterialText" HeaderText="MaterialText" 
                SortExpression="MaterialText" />
            <asp:BoundField DataField="ProductPercentage" HeaderText="ProductPercentage" 
                SortExpression="ProductPercentage" />
             <asp:BoundField DataField="UnitUserfield2" HeaderText="UnitUserfield2" 
                SortExpression="UnitUserfield2" />
            <asp:BoundField DataField="Comment" HeaderText="Comment" 
                SortExpression="Comment" />

        </Columns>
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#999999" />
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    </asp:GridView>

И это код позади:

public partial class TOP : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["MemberKey"] = "FM00012";

            GridView1.DataSourceID = null;
            GridView1.DataBind();
        }
    }

    private object GetMaterialData(string MemberKey, string MaterialType, string MaterialLevel, int Count)
    {
        CompleteWeightsDataContext db = new CompleteWeightsDataContext();
        var query = db.tblOnlineReportingCOMPLETEWeights
                    .Where(x => x.MemberId == MemberKey && x.MaterialText == MaterialType && x.MaterialLevel == MaterialLevel)
                    .OrderByDescending(x => x.ProductPercentage)
                    .Take(Count);
        return query;
      }

       protected void btnDisplayTopReport_Click(object sender, EventArgs e)
    {
        GridView1.DataSourceID = null;
        GridView1.DataBind();

        if (radTOP.SelectedValue == "" || tbxHowMany.Text == "")
        {
            MessageBox.Show("Please Ensure that BOTH 'The Number of Products' and Appropriate material Is selected Before You Attempt To Run a TOP X Report", "Top X Error!!!",
                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            GridView1.DataSourceID = null;
            GridView1.DataBind();
        }
       else
        {
            int max = 0;
            if (int.TryParse(tbxHowMany.Text, out max))
            {
                GridView1.DataSource = GetMaterialData(Session["MemberKey"].ToString(), radTOP.SelectedItem.Value, "Primary", max);
                GridView1.DataBind();
            }
        }
    }


    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {

    }

}

Теперь я знаю, что должен заполнить событие сортировки, но я попробовал ооочень много комбинаций, я попал в правильный рассол (отсюда ноль!).

Я подозреваю, что у меня будут трудности, так как linq, который он использует для заполнения вида сетки, использует take, чтобы данные могли быть потеряны при запуске сортировки.

Может ли кто-нибудь указать мне правильное направление и как я могу этого достичь? Точно так же я знаю, что столкнусь с подобными проблемами с обновлением строк и редактированием строк, поэтому, если у меня есть предложения для достижения желаемых результатов, я был бы очень признателен ... на самом деле, вы можете присоединиться ко мне для праздничного напитка в моем местном !

1 Ответ

0 голосов
/ 24 декабря 2009

Я не совсем уверен, что вы пытаетесь сделать, но обычно для сортировки столбцов в виде сетки используется обработчик сортировки. Вы можете сослаться на этот пример кода ниже, в котором я обрабатываю сортировку по возрастанию или убыванию, а также кэширую, чтобы мне не приходилось снова обращаться к базе данных при сортировке по столбцу.

Но, как правило, вы хотите обновить источник данных для вида сетки и заново связать его с отсортированным результатом.

/// <summary>
/// <para>Event handler for sorting items in the grid. It allows the user to sort by any column in the grid.
/// The method makes use of caching to reduce access to the persistence layer.</para>
/// </summary>
/// <param name="sender">The sender which triggered the event.</param>
/// <param name="e">The event arguments.</param>
protected void gvFileList_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression;

    DataSet ds = (DataSet)HttpRuntime.Cache[Session.SessionID + "dsFileList"];
    if (ds == null)
    {
        LoadGridData();
        ds = (DataSet)HttpRuntime.Cache[Session.SessionID + "dsFileList"];
    }
    ds.Tables[0].DefaultView.Sort = e.SortExpression;

    // check the cache to see if user has sorted by this column (i.e. this SortExpression)
    // previously, and if they have, reverse the sort direction
    if (HttpRuntime.Cache[Session.SessionID + "dsFileList" + e.SortExpression] != null)
    {
        // get the previous sort direction from the cache
        string dir = (string)HttpRuntime.Cache[Session.SessionID + "dsFileList" + e.SortExpression];

        // reverse the sort direction and update the cache
        if (dir == "ASC")
        {
            Helper.AddToCache(Session.SessionID + "dsFileList" + e.SortExpression, "DESC", 120);
            ds.Tables[0].DefaultView.Sort += " DESC";
            sortExpression = e.SortExpression + " DESC";
        }
        else
        {
            Helper.AddToCache(Session.SessionID + "dsFileList" + e.SortExpression, "ASC", 120);
            ds.Tables[0].DefaultView.Sort += " ASC";
            sortExpression = e.SortExpression + " ASC";
        }
    }
    else
    {
        // this column has not been sorted on previously, so update the cache with
        // sort direction = ASC for this column since ascending is the initial
        // sort direction
        Helper.AddToCache(Session.SessionID + "dsFileList" + e.SortExpression, "ASC", 120);
        sortExpression = e.SortExpression + " ASC";
    }

    gvFileList.DataSource = ds.Tables[0].DefaultView;
    gvFileList.DataBind();

    // store the sort expression in cache so that when the grid is refreshed by the tmTFFileList_Tick
    // method, we can get the sort expression to use
    Helper.AddToCache(Session.SessionID + "dsFileList.SortExpression", sortExpression, 120);
}
...