#######GridView嵌套棘手问题####### 高手帮忙~~~~~~~

zwwlovezy1 2007-11-02 05:58:01
我现在做一个GridView嵌套的东西--(图见附件)
绑定外面的GridView1很容易 直接写一个绑定方法一调用就可以了
但是里面嵌套的GridView2需要通过得到外面GridView1的主键值做为sql语句的where条件(我想我说的能让你明白)
protected void Page_Load(object sender, EventArgs e)
{
Page.SmartNavigation = true;
if (!IsPostBack)
{
Bind();
}
}

#region//公用方法
public void conString()
{
string connstr = System.Configuration.ConfigurationSettings.AppSettings["HotelConString"];
con = new SqlConnection(connstr);
}
#endregion

#region//页面加载时绑定
public void Bind()
{
conString();
string sql = "select * from NullRoomInfo where i_reserve_del = 1";
da = new SqlDataAdapter(sql,con);
ds = new DataSet();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
okEnable();
DRoomBind();
RoomTypeBind();

for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridView1.Rows[i].Cells[5].FindControl("GridView2").Visible = false;
}
}
#endregion

#region//页面加载时绑定,如果房间数大于1则显示"+",否则显示"-"
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Button delDel = (Button)e.Row.Cells[8].FindControl("delBtn");
//添加GridView1的删除按钮提示
delDel.Attributes.Add("onclick", "javascript:return confirm('是否删除订房人信息,请注意,如果删除,这个人订的所有房间都会被删除!')");
//加号时变成减号,减号时变成加号
Label lblnum = (Label)e.Row.Cells[5].FindControl("lblrc");
ImageButton img = (ImageButton)e.Row.Cells[5].FindControl("imgSign");
if (Convert.ToInt32(lblnum.Text) >= 1)
{
img.ImageUrl = @"\Hotel\style\img\add.gif";
}
//*****************************************************************************
//绑定嵌套的GridView2
GridView gvin = (GridView)e.Row.Cells[5].FindControl("GridView2");
int idin = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Value.ToString());
string sqlin = "select * from hotel_DroomInfo where i_reserve_id = '" + idin + "'";
conString();
da = new SqlDataAdapter(sqlin, con);
ds = new DataSet();
da.Fill(ds);
gvin.DataSource = ds;
gvin.DataBind();
}
}
#endregion

现在这样已经把GridView1和GridView2都已经绑定好了
但是后面要做一个GridView2(里面被嵌套的GridView)的模板列删除操作
删除后不能像GridView1一样调用自己的Bind()方法,只能通过进入GridView2_RowDataBound()事件进行绑定,这样删除GridView2中数据后页面才回重新绑定(我想做个绑定操作的朋友都应该能理解我的一样),
现在我已经把GridView2_RowDataBound()事件中的代码写好了:
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[3].Attributes.Add("onclick", "javascript:return confirm('是否删除订房人信息?')");
GridView Gv2 = (GridView)e.Row.Parent.Parent;
GridViewRow gvr = (GridViewRow)Gv2.NamingContainer;
//得到触发源所在GridView1行的ID
int id = Convert.ToInt32(GridView1.DataKeys[gvr.RowIndex].Value.ToString());
string sql = "select * from hotel_DroomInfo where i_reserve_id = '" + id + "'";
conString();
da = new SqlDataAdapter(sql, con);
ds = new DataSet();
da.Fill(ds);
Gv2.DataSource = ds;
Gv2.DataBind();
}
}
先通过得到找外面GridView1的每行主键值,这样里面的sql语句就有where条件了。
当我加断点的时候他会进入断点,而且我看取到的值都是正确的,但进入页面后,并没有绑定上。
把GridView1_RowDataBound()事件中绑定GridView2的代码注释后,留下GridView2_RowDataBound()中绑定代码,结果什么都没有绑定上

要是GridView1_RowDataBound和GridView2_RowDataBound中绑定代码都留着的话,页面加载时提示该页无法显示,郁闷了。。
...全文
129 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
马老虎 2010-04-20
  • 打赏
  • 举报
回复
这帖子真老!
zwwlovezy1 2007-11-05
  • 打赏
  • 举报
回复
jokulyang 的方法我很早已经试过了,但是还是不可以的
joeweng 的方法我觉得有点多余
JGood 的方法后来我试了一下,也是不行的,你就算用了deleting事件写的话,最后还是要调一个自己写的绑定方法,但是gridview2毕竟是嵌套的,没有办法像gridview1一样随便写个绑定方法就能够调用,所以也是不可行的。

最后的解决办法:
我还是自己给他加个模板列,里面放个checkbox,然后让他多选删除吧,最后整体刷新一下页面得了。。。

但是还是感谢大家!揭贴了!
JGood 2007-11-02
  • 打赏
  • 举报
回复
删除后不能像GridView1一样调用自己的Bind()方法,只能通过进入GridView2_RowDataBound()事件进行绑定,这样删除GridView2中数据后页面才回重新绑定(我想做个绑定操作的朋友都应该能理解我的一样)
====>
这句什么意思???

在GridView2_RowDataBound事件里,为什么要重新绑定Gv2?
在GridView1_RowDataBound事件里已经把GridView2绑定了,在GridView2_RowDataBound事件里,为什么还要重新绑定一次(其实是N多次)呢?岂不浪费N多资源??(可能我看的不是很清楚)


楼主删除GridView2中的某一行后,不用重新绑定GridView1,只要重新绑定GridView2就可以了。绑定事件写在GridView2的删除事件里。
joeweng 2007-11-02
  • 打赏
  • 举报
回复
把GRIDVIEW2 做成用户控件试试
jokulyang 2007-11-02
  • 打赏
  • 举报
回复


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
GridView gv = (GridView)e.Row.FindControl("GridViewSpendDetail");

gv.DataSource = GetDetailInfo(Int32.Parse(e.Row.Cells[0].Text));
gv.DataBind();



}

}

GridView2_RowDataBound事件 不用写获取信息的内容。

zwwlovezy1 2007-11-02
  • 打赏
  • 举报
回复
再说一下 记录列使用的全是绑定列
有按钮的列使用的全是模板列
要是把断点直接加在GridView1_RowDataBound事件中(但GridView1_RowDataBound中没有绑定GridView2代码)他只回执行完GridView1_RowDataBound中事件,并不进入GridView2_RowDataBound事件

要是把代码加在GridView2_RowDataBound事件中(GridView1_RowDataBound中没有绑定代码),则会进入GridView2_RowDataBound事件,而且取出的值是正确的。。。

做了一天了脑袋都迷糊了。。
请各位帮帮忙吧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧