Gridview排序,更新和编辑

时间:2009-12-24 14:45:46

标签: linq gridview sorting editing

祝你们所有人都有问候。我真的需要一些帮助,因为这让我很生气。

目标。我有一个文本框,客户输入一个数字,他们点击一个单选按钮列表来选择一个材料,然后按一个按钮来填充一个网格视图。

这是前端代码:

<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)
    {

    }

}

现在我知道我必须填充排序事件,但我尝试了很多组合,我已经让自己处于正确的泡菜中(因此无效!)。

我怀疑我会遇到困难,因为它用来填充gridview的linq正在使用take,因此在运行排序时数据可能会丢失。

有人可以指出我正确的方向以及如何实现这一目标吗?同样地,我知道我会遇到类似排序和划船的问题,所以如果我可以建议达到预期效果,我会非常感激...事实上,欢迎你和我一起去当地享用一杯节日饮料。 !

1 个答案:

答案 0 :(得分:0)

我不完全确定你要做什么,但通常,排序处理程序用于对gridview中的列进行排序。您可以参考下面的示例代码,我在其中通过升序或降序处理排序,以及缓存,因此当按列排序时,我不必再次访问数据库。

但一般来说,您希望更新网格视图的数据源并使用排序结果重新绑定它。

/// <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);
}