我正在开发可编辑的嵌套GridView。 我发现了这篇文章Found at Code Project
我想通过绑定来自Code-Behind的2个父子网格而不是标记页面中的asp:AccessDataSource来实现同样的目的。
另外请建议如何使用更新面板实现它,就像我使用更新面板一样,当我在子网格中单击编辑时,它会折叠子网格。
我尝试过这样的事情,但我没有成功。
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
}
提前感谢您的时间。
答案 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>