ASP.Net嵌套网格更新问题,同时通过SQL Server绑定数据

时间:2012-01-29 23:49:13

标签: asp.net aspxgridview

我正在开发可编辑的嵌套GridView。 我发现了这篇文章Found at Code Project

  1. 我想通过绑定来自Code-Behind的2个父子网格而不是标记页面中的asp:AccessDataSource来实现同样的目的。

  2. 另外请建议如何使用更新面板实现它,就像我使用更新面板一样,当我在子网格中单击编辑时,它会折叠子网格。

  3. 我尝试过这样的事情,但我没有成功。

     public partial class test : System.Web.UI.Page
    {
        #region Variables
        string gvUniqueID = String.Empty;
        int gvNewPageIndex = 0;
        int gvEditIndex = -1;
        string gvSortExpr = String.Empty;
        private string gvSortDir
        {
    
            get { return ViewState["SortDirection"] as string ?? "ASC"; }
    
            set { ViewState["SortDirection"] = value; }
    
        }
        #endregion
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
                userroles a = new userroles();
                this.GridView1.DataSource = a.GetCustomersTable();
                this.GridView1.DataBind();
    
        }
        //This procedure returns the Sort Direction
        private string GetSortDirection()
        {
            switch (gvSortDir)
            {
                case "ASC":
                    gvSortDir = "DESC";
                    break;
    
                case "DESC":
                    gvSortDir = "ASC";
                    break;
            }
            return gvSortDir;
        }
    
        //This procedure prepares the query to bind the child GridView
        private AccessDataSource ChildDataSource(string strCustometId, string strSort)
        {
            string strQRY = "";
            AccessDataSource dsTemp = new AccessDataSource();
            dsTemp.DataFile = "App_Data/Northwind.mdb";
            strQRY = "SELECT [Orders].[CustomerID],[Orders].[OrderID]," +
                                    "[Orders].[ShipAddress],[Orders].[Freight],[Orders].[ShipName] FROM [Orders]" +
                                    " WHERE [Orders].[CustomerID] = '" + strCustometId + "'" +
                                    "UNION ALL " +
                                    "SELECT '" + strCustometId + "','','','','' FROM [Orders] WHERE [Orders].[CustomerID] = '" + strCustometId + "'" +
                                    "HAVING COUNT(*)=0 " + strSort;
    
            dsTemp.SelectCommand = strQRY;
            return dsTemp;
        }   
    
        #region GridView1 Event Handlers
        //This event occurs for each row
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            GridViewRow row = e.Row;
            string strSort = string.Empty;
    
            // Make sure we aren't in header/footer rows
            if (row.DataItem == null)
            {
                return;
            }
    
            //Find Child GridView control
            GridView gv = new GridView();
            gv = (GridView)row.FindControl("GridView2");
    
            //Check if any additional conditions (Paging, Sorting, Editing, etc) to be applied on child GridView
            if (gv.UniqueID == gvUniqueID)
            {
                gv.PageIndex = gvNewPageIndex;
                gv.EditIndex = gvEditIndex;
                //Check if Sorting used
                if (gvSortExpr != string.Empty)
                {
                    GetSortDirection();
                    strSort = " ORDER BY " + string.Format("{0} {1}", gvSortExpr, gvSortDir);
                }
                //Expand the Child grid
                ClientScript.RegisterStartupScript(GetType(), "Expand", "<SCRIPT LANGUAGE='javascript'>expandcollapse('div" + ((DataRowView)e.Row.DataItem)["CustomerID"].ToString() + "','one');</script>");
            }
    
            //Prepare the query for Child GridView by passing the Customer ID of the parent row
            gv.DataSource = ChildDataSource(((DataRowView)e.Row.DataItem)["CustomerID"].ToString(), strSort);
            gv.DataBind();
    
            //Add delete confirmation message for Customer
            //LinkButton l = (LinkButton)e.Row.FindControl("linkDeleteCust");
            //l.Attributes.Add("onclick", "javascript:return " +
            //"confirm('Are you sure you want to delete this Customer " +
            //DataBinder.Eval(e.Row.DataItem, "CustomerID") + "')");
    
        }
    
    
        #endregion
    
        #region GridView2 Event Handlers
        protected void GridView2_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView gvTemp = (GridView)sender;
            gvUniqueID = gvTemp.UniqueID;
            gvNewPageIndex = e.NewPageIndex;
            GridView1.DataBind();
        }
    
        protected void GridView2_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "AddOrder")
            {
                try
                {
                    GridView gvTemp = (GridView)sender;
                    gvUniqueID = gvTemp.UniqueID;
    
                    //Get the values stored in the text boxes
                    string strCustomerID = gvTemp.DataKeys[0].Value.ToString();  //Customer ID is stored as DataKeyNames
                    string strFreight = ((TextBox)gvTemp.FooterRow.FindControl("txtFreight")).Text;
                    string strShipperName = ((TextBox)gvTemp.FooterRow.FindControl("txtShipperName")).Text;
                    string strShipAdress = ((TextBox)gvTemp.FooterRow.FindControl("txtShipAdress")).Text;
    
                    //Prepare the Insert Command of the DataSource control
                    string strSQL = "";
                    strSQL = "INSERT INTO Orders (CustomerID, Freight, ShipName, " +
                            "ShipAddress) VALUES ('" + strCustomerID + "'," + float.Parse(strFreight) + ",'" +
                            strShipperName + "','" + strShipAdress + "')";
    
                    //AccessDataSource1.InsertCommand = strSQL;
                    //AccessDataSource1.Insert();
                    ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('Order added successfully');</script>");
    
                    GridView1.DataBind();
                }
                catch (Exception ex)
                {
                    ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('" + ex.Message.ToString().Replace("'", "") + "');</script>");
                }
            }
        }
    
        protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView gvTemp = (GridView)sender;
            gvUniqueID = gvTemp.UniqueID;
            gvEditIndex = e.NewEditIndex;
            GridView1.DataBind();
        }
    
        protected void GridView2_CancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            GridView gvTemp = (GridView)sender;
            gvUniqueID = gvTemp.UniqueID;
            gvEditIndex = -1;
            GridView1.DataBind();
        }
    
        protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            try
            {
                GridView gvTemp = (GridView)sender;
                gvUniqueID = gvTemp.UniqueID;
    
                //Get the values stored in the text boxes
                string strOrderID = ((Label)gvTemp.Rows[e.RowIndex].FindControl("lblOrderID")).Text;
                string strFreight = ((TextBox)gvTemp.Rows[e.RowIndex].FindControl("txtFreight")).Text;
                string strShipperName = ((TextBox)gvTemp.Rows[e.RowIndex].FindControl("txtShipperName")).Text;
                string strShipAdress = ((TextBox)gvTemp.Rows[e.RowIndex].FindControl("txtShipAdress")).Text;
    
                //Prepare the Update Command of the DataSource control
                AccessDataSource dsTemp = new AccessDataSource();
                dsTemp.DataFile = "App_Data/Northwind.mdb";
                string strSQL = "";
                strSQL = "UPDATE Orders set Freight = " + float.Parse(strFreight) + "" +
                         ",ShipName = '" + strShipperName + "'" +
                         ",ShipAddress = '" + strShipAdress + "'" +
                         " WHERE OrderID = " + strOrderID;
                dsTemp.UpdateCommand = strSQL;
                dsTemp.Update();
                ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('Order updated successfully');</script>");
    
                //Reset Edit Index
                gvEditIndex = -1;
    
                GridView1.DataBind();
            }
            catch { }
        }
    
        protected void GridView2_RowUpdated(object sender, GridViewUpdatedEventArgs e)
        {
            //Check if there is any exception while deleting
            if (e.Exception != null)
            {
                ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('" + e.Exception.Message.ToString().Replace("'", "") + "');</script>");
                e.ExceptionHandled = true;
            }
        }
    
        protected void GridView2_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            GridView gvTemp = (GridView)sender;
            gvUniqueID = gvTemp.UniqueID;
    
            //Get the value        
            string strOrderID = ((Label)gvTemp.Rows[e.RowIndex].FindControl("lblOrderID")).Text;
    
            //Prepare the Update Command of the DataSource control
            string strSQL = "";
    
            try
            {
                strSQL = "DELETE from Orders WHERE OrderID = " + strOrderID;
                AccessDataSource dsTemp = new AccessDataSource();
                dsTemp.DataFile = "App_Data/Northwind.mdb";
                dsTemp.DeleteCommand = strSQL;
                dsTemp.Delete();
                ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('Order deleted successfully');</script>");
                GridView1.DataBind();
            }
            catch { }
        }
    
        protected void GridView2_RowDeleted(object sender, GridViewDeletedEventArgs e)
        {
            //Check if there is any exception while deleting
            if (e.Exception != null)
            {
                ClientScript.RegisterStartupScript(GetType(), "Message", "<SCRIPT LANGUAGE='javascript'>alert('" + e.Exception.Message.ToString().Replace("'", "") + "');</script>");
                e.ExceptionHandled = true;
            }
        }
    
        protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //Check if this is our Blank Row being databound, if so make the row invisible
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (((DataRowView)e.Row.DataItem)["OrderID"].ToString() == String.Empty) e.Row.Visible = false;
            }
        }
    
        protected void GridView2_Sorting(object sender, GridViewSortEventArgs e)
        {
            GridView gvTemp = (GridView)sender;
            gvUniqueID = gvTemp.UniqueID;
            gvSortExpr = e.SortExpression;
            GridView1.DataBind();
        }
        #endregion
    
    }
    

    提前感谢您的时间。

1 个答案:

答案 0 :(得分:0)

你可以参考这个。

这是使用对象数据源

 <asp:UpdatePanel runat="server" UpdateMode="Always" ID="ParentPanel">
<ContentTemplate>
<asp:Label ID="lbltest" runat="server" />
<asp:GridView   ID="grdOrders" 
                DataKeyNames="OrderId" 
                GridLines="None"  
                AutoGenerateColumns="false" 
                runat="server" 
                DataSourceID="objOrders" 
                CssClass="mGrid" 
                PagerStyle-CssClass="pgr" 
                AlternatingRowStyle-CssClass="alt"
                AllowPaging  ="true" 
                PageSize="10" 
                OnRowCommand="grdOrders_RowCommand" 
                OnRowDataBound ="grdOrders_RowDataBound" >
    <Columns>
        <asp:TemplateField ItemStyle-Width="9">
            <ItemTemplate>
                <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                    runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="companyname" HeaderText="Company Name" SortExpression="companyname" />
        <asp:BoundField DataField="employeename" HeaderText="Employee Name" SortExpression="employeename" />
        <asp:BoundField DataField="orderdate" HeaderText="Order Name" SortExpression="orderdate" />
        <asp:BoundField DataField="requireddate" HeaderText="Required Date" SortExpression="requireddate" />
        <asp:BoundField DataField="shippeddate" HeaderText="Shipped Date" SortExpression="shippeddate" />  
        <asp:TemplateField>
            <ItemTemplate>
                <asp:PlaceHolder ID="objPHOrderDetails" runat="server" Visible="true">
                <tr>
                    <td width="9">
                    </td>
                    <td colspan="6">
                        <asp:UpdatePanel runat="server" ID="ChildControl">
                        <ContentTemplate>
                        <asp:GridView   ID="grdOrderDetails" 
                                        GridLines="None"  
                                        AutoGenerateColumns="false" 
                                        runat="server" 
                                        DataSourceID="objOrderDetails" 
                                        CssClass="mGrid"  
                                        AllowPaging  ="true"  
                                        PageSize="2"
                                        >
                        <EditRowStyle BackColor="#2461BF" />
                        <Columns>
                            <asp:BoundField DataField="PRODUCTNAME" HeaderText="Product Name" SortExpression="PRODUCTNAME" ReadOnly="true" />
                            <asp:BoundField DataField="QUANTITYPERUNIT" HeaderText="Quantity Per Unit" SortExpression="QUANTITYPERUNIT" ReadOnly="true"  />
                            <asp:BoundField DataField="QUANTITY" HeaderText="Quantity" SortExpression="QUANTITY"/>
                            <asp:BoundField DataField="UNITPRICE" HeaderText="Unit Price" SortExpression="UNITPRICE" ReadOnly="true"  />
                            <asp:BoundField DataField="DISCOUNT" HeaderText="Discount" SortExpression="DISCOUNT" ReadOnly="true"  />  
                            <asp:BoundField DataField="TotalAmount" HeaderText="TotalAmount" SortExpression="TotalAmount" ReadOnly="true"  />  
                            <asp:CommandField ShowEditButton="True" ButtonType="Image" EditImageUrl="Include/images/gridplus.gif" UpdateImageUrl="Include/images/gridplus.gif" CancelImageUrl="Include/images/gridminus.gif" />
                        </Columns>
                    </asp:GridView>
                    </ContentTemplate>
                    </asp:UpdatePanel>
                    <asp:ObjectDataSource   ID="objOrderDetails" 
                                            runat="server" 
                                            SelectMethod="GetOrdersDetailsList" 
                                            UpdateMethod="UpdateOrdersDetails"
                                            onupdated="grdOrderDetails_Updated"
                                            EnablePaging="true" 
                                            TypeName="clsGeneralFunctions" 
                                            SelectCountMethod="GetOrdersDetailsCount">
                        <SelectParameters>
                            <asp:Parameter Direction="Input" Name="StartRowIndex" type="Int32" />
                            <asp:Parameter Direction="Input" Name="MaximumRows" type="Int32" />
                            <asp:Parameter Direction="Input" Name="OrderId" DefaultValue="0" type="Int32" />
                        </SelectParameters>                                
                        <UpdateParameters>
                            <asp:Parameter Direction="Input"  Name="OrderId" DefaultValue="0" type="Int32" />
                            <asp:Parameter Direction="Input"  Name="Quantity" DefaultValue="0" type="Int32" />
                        </UpdateParameters>
                    </asp:ObjectDataSource>
                </asp:PlaceHolder>                
            </ItemTemplate>
        </asp:TemplateField>                      
    </Columns>    
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>

<asp:ObjectDataSource   ID="objOrders" 
                        runat="server" 
                        SelectMethod="GetOrders" 
                        EnablePaging="true" 
                        TypeName="clsGeneralFunctions" 
                        StartRowIndexParameterName="StartRowIndex" 
                        MaximumRowsParameterName="MaximumRows" 
                        SelectCountMethod="GetOrdersCount">
</asp:ObjectDataSource>