2009-12-24 133 views
0

季节向大家致意。我真的需要一些帮助,因为这让我很生气。Gridview排序,更新和编辑

目的。我有一个客户端输入一个数字的文本框,他们点击一个单选按钮列表来选择一个材质并点击一个按钮来填充gridview。

这是前端代码:

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

    } 

} 

现在我知道我必须填充排序事件,但我已经尝试了SOOO许多组合,我已经把自己放在了一个正确的腌菜里(因此是空的!)。

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

有人可以请指出我在正确的方向,我该如何实现这一目标?同样,我知道我会遇到与rowupdating和rowediting类似的问题,所以如果我可以建议实现理想的结果,我将非常感激......事实上,欢迎您与我一起在我的本地参加节日饮料!

回答

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