ajax GridView 嵌套 弹出模态窗口
页面结构 大体
第一层 updatepanel2
第二层 GridView1
GridView1的字段1
GridView1的字段2
GridView1的模板列1
第三层 1 GridView2
GridView1的模板列1
GridView1的模板列2
第三层 2 updatepanel1
第四层 GridView3
第三层 2 updatepanel1
GridView1的模板列2
第二层 GridView1
第一层 updatepanel2
特别说明
第四层的 GridView3 是由 GridView1 的模板列2 里 一个 LinkButton点击后填充的,
并由 AjaxControlToolkit 的 ModalPopupExtender 控件的模态弹出窗口负责显示的 ,
GridView3 里的数据是可以同时更新的。ModalPopupExtender 的显示控制是由后台负责的。
GridView 需要的数据 是由 linq提供的。所以这些代码拿过去是不能够直接使用的。
页面结构
<%@ Page Language="C#" MasterPageFile="~/Master/WareHouse.master" Theme="DataWebControls" AutoEventWireup="true" CodeFile="ProductionSearch.aspx.cs" Inherits="Pages_WareHouse_ProductionSearch" Title="Untitled Page" %> <%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="cc1" %> <asp:Content ID="Content1" ContentPlaceHolderID="MasterContent" Runat="Server"> <style type="text/css"> <!-- .modalBackground { background-color:Gray; filter:alpha(opacity=70); opacity:0.7; } --> </style> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" onrowdatabound="GridView1_RowDataBound" Width="700px" > <Columns> <asp:BoundField DataField="id" HeaderText="ID" /> <asp:BoundField DataField="name" HeaderText="Name" /> <asp:TemplateField> <ItemTemplate> <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false" ShowHeader="false" onrowediting="GridView2_RowEditing" OnRowUpdating="GridView2_RowUpdating" OnRowCancelingEdit="GridView2_RowCancelingEdit" OnRowDeleting="GridView2_RowDeleting"> <Columns> <asp:BoundField DataField="id" > <HeaderStyle Width="50px" /> </asp:BoundField> <asp:BoundField DataField="name" > <HeaderStyle Width="50px" /> </asp:BoundField> <asp:CommandField ShowEditButton="True" > <HeaderStyle Width="100px" /> </asp:CommandField> <asp:CommandField ShowDeleteButton="True" > <HeaderStyle Width="50px" /> </asp:CommandField> </Columns> </asp:GridView> </ItemTemplate> <HeaderStyle Width="300px" /> </asp:TemplateField> <asp:TemplateField> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" oncommand="LinkButton1_Command" CommandArgument='<%# Eval("id") %>'>修改</asp:LinkButton> <cc1:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="LinkButton1" PopupControlID="Panel1" PopupDragHandleControlID="Panel2" BackgroundCssClass="modalBackground" Enabled = "false" CancelControlID="CencelButton"> </cc1:ModalPopupExtender> <asp:Panel ID="Panel1" runat="server" Width="300px" style="display:none; background-color:White;border:solid 1px black;"> <asp:Panel ID="Panel2" runat="server" Style="cursor: move;background-color:#DDDDDD;border:solid 1px Gray;color:Black"> fdsafsda</asp:Panel> <asp:UpdatePanel ID="UpdatePanel1" runat="server" > <ContentTemplate> <asp:GridView ID="DetailGridView" runat="server" AutoGenerateColumns="false" > <Columns> <asp:TemplateField HeaderText="UserID"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="UserID"> <ItemTemplate> <asp:TextBox ID="TB_UserID" runat="server" Text='<%# Eval("userid") %>' ReadOnly="true"></asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="CarID"> <ItemTemplate> <asp:TextBox ID="TB_CarID" runat="server" Text='<%# Eval("id") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="CarName"> <ItemTemplate> <asp:TextBox ID="TB_CarName" runat="server" Text='<%# Eval("name") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> <HeaderStyle ForeColor="#33CCFF" /> </asp:GridView> </ContentTemplate> </asp:UpdatePanel> <p> <asp:Button ID="UpdateButton" runat="server" Text="确定" OnClick="UserCarUpdateButton_OnClick" /> <asp:Button ID="CencelButton" runat="server" Text="取消" /> </p> </asp:Panel> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </ContentTemplate> </asp:UpdatePanel> </asp:Content>
后台代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using AjaxControlToolkit;
public partial class Pages_WareHouse_ProductionSearch : System.Web.UI.Page
{
// 暂时使用的 userList 的缓存 key
private string user_LIST_CACHE_KEY = "userListCache";
private IUserService userService = null;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
initPage();
}
}
/// <summary>
/// 页面初始化
/// </summary>
public void initPage()
{
userService = ServiceFactory.getUserService();
IList<user> userList = userService.getUser();
//这个 将查出来的数据缓存一下 不应该写在这里
HttpRuntime.Cache.Insert(user_LIST_CACHE_KEY, userList);
this.GridView1.DataSource = userList;
this.GridView1.DataKeyNames = new String[] { "id" };
this.GridView1.DataBind();
}
/// <summary>
/// 子GridView2的删除事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView2_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//这里 要有相应的代码
}
/// <summary>
/// 外层GridView1的 行绑定事件
/// 在这里绑定每行的 子 GridVeiw2
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
int userID = int.Parse(GridView1.DataKeys[e.Row.RowIndex].Value.ToString());
GridView gv = (GridView)e.Row.FindControl("GridView2");
gv.DataSource = getCars(userID);
gv.DataKeyNames = new string[] { "id", "userid" };
gv.DataBind();
}
}
/// <summary>
/// 取得user的Car列表
/// </summary>
/// <param name="id">userID</param>
/// <returns></returns>
private IList getCars(int userID)
{
//IList<user> userList = ((IList<user>)Cache.Get(user_LIST_CACHE_KEY));
userService = ServiceFactory.getUserService();
IList<user> userList = userService.getUser();
return (from u in userList where u.id == userID select u.Cars).ToList()[0];
}
/// <summary>
/// 子GridView2的更新事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//dataBind();
GridView gv2 = (GridView)sender;
Car car = new Car();
car.name = ((TextBox)gv2.Rows[e.RowIndex].Cells[1].Controls[0]).Text.ToString().Trim();
car.id = int.Parse(gv2.DataKeys[e.RowIndex].Values["id"].ToString());
int userID = int.Parse(gv2.DataKeys[e.RowIndex].Values["userid"].ToString());
//这里调用更新Car的方法
gv2.EditIndex = -1;
gv2.DataSource = getCars(userID);
gv2.DataBind();
}
/// <summary>
/// 子GridView2的到切换的编辑状态的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView gv2 = (GridView)sender;
gv2.EditIndex = e.NewEditIndex;
int carID = int.Parse(gv2.DataKeys[e.NewEditIndex].Value.ToString());
int userID = int.Parse(gv2.DataKeys[e.NewEditIndex].Values["userid"].ToString());
gv2.DataSource = getCars(userID);
gv2.DataBind();
}
/// <summary>
/// 子GridView2的取消编辑状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView2_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView gv2 = (GridView)sender;
gv2.EditIndex = -1;
int userID = int.Parse(gv2.DataKeys[e.RowIndex].Values["userid"].ToString());
gv2.DataSource = getCars(userID);
gv2.DataBind();
}
/// <summary>
/// 弹出详细页面的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButton1_Command(object sender, CommandEventArgs e)
{
int userID = int.Parse(e.CommandArgument.ToString());
LinkButton lb = (LinkButton)sender;
GridView detailGV = (GridView)lb.Parent.FindControl("DetailGridView");
detailGV.DataSource = getCars(userID);
detailGV.DataKeyNames = new string[] { "id", "userid" };
detailGV.DataBind();
ModalPopupExtender mpe = (ModalPopupExtender)lb.Parent.FindControl("ModalPopupExtender1");
mpe.Enabled = true;
mpe.Show();
}
/// <summary>
/// 更新用户的汽车的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void UserCarUpdateButton_OnClick(object sender, EventArgs e)
{
Button updateButton = (Button)sender;
GridView gv = (GridView)updateButton.Parent.FindControl("DetailGridView");
CarDao carDao = new CarDao();
//取得全部的汽车的信息 逐个更新
for (int i = 0; i < gv.Rows.Count; i++)
{
GridViewRow row = gv.Rows[i];
string userID = ((TextBox)row.Cells[0].FindControl("TB_UserID")).Text.Trim();
string carID = ((TextBox)row.Cells[1].FindControl("TB_CarID")).Text.Trim();
string carName = ((TextBox)row.Cells[1].FindControl("TB_CarName")).Text.Trim();
//这里应该作更新的操作
carDao.updateCarLinq(new Car { id = int.Parse(carID), name = carName, userid = int.Parse(userID)});
}
ModalPopupExtender mpe = (ModalPopupExtender)gv.Parent.FindControl("ModalPopupExtender1");
mpe.Enabled = false;
//更新后 重新更新一下页面
initPage();
this.UpdatePanel2.Update();
}
}
vs 2008 下测试通过