各位大侠!帮忙看下这个问题(GridView动态添加列,刷新(回发),模板列的控件丢失)

光与影的嬉戏 2013-03-08 04:09:15
在CSDN看到这样一篇:http://bbs.csdn.net/topics/320247030

介绍在OnInit中动态添加列,模板列的控件不会丢失
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}

但是我的需求是要根据页面控件的值动态创建GridView。可是在OnInit中无法获取页面控件的值
如:
一个gridview初始有固定的模板列用来勾选

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="False" ShowHeader="True"
Width="100%">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<input type='checkbox' id='chkAllSelect' name='chkAllSelect' onclick="CheckAll(this)"
runat="server" />
</HeaderTemplate>
<ItemTemplate>
<input type="checkbox" id="chkSelect" name="chkSelect" runat="server" value='<%# Eval("Did")%> ' />
</ItemTemplate>
<ItemStyle Width="20px" />
</asp:TemplateField>
</Columns>
</asp:GridView>

根据年月再生成其他日期列

//创建列的方法
public void CreateGridView(GridView dataview, int year, int month)
{
int i;
int CurMonthDay = DateTime.DaysInMonth(year, month);
int count = dataview.Columns.Count;
for (i = 1; i < count; i++)
{
dataview.Columns.RemoveAt(1);//再次查询时删除所有日期列,重新加载日期列,重一开始是为了保存勾选列
}
for (i = 0; i < CurMonthDay; i++)
{
int day;
DateTime tm = new DateTime(year, month, i + 1);
ImageField newcoltp = new ImageField();

switch (tm.DayOfWeek)
{
case DayOfWeek.Sunday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n日";
break;

case DayOfWeek.Monday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n一";
break;

case DayOfWeek.Tuesday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n二";
break;

case DayOfWeek.Wednesday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n三";
break;

case DayOfWeek.Thursday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n四";
break;

case DayOfWeek.Friday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n五";
break;

case DayOfWeek.Saturday:
newcoltp.HeaderText = ((i + 1)).ToString() + "\n六";
break;
}
newcoltp.ItemStyle.Width = 20;
newcoltp.DataImageUrlField = string.Format("DDay{0}", i + 1);
dataview.Columns.Add(newcoltp);
}

}


要求在点击查询按钮时候 根据年,月实现gridview的创建,并使勾选列的勾选控件不丢失,如何实现啊!
各位大侠!!!
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
JRKaneko 2013-12-29
  • 打赏
  • 举报
回复
请问楼主这个问题解决了吗?
JRKaneko 2013-12-29
  • 打赏
  • 举报
回复
请问楼主这个问题解决了吗?
weiki516 2013-09-07
  • 打赏
  • 举报
回复
遇到同样的问题 不知道 如何解决的
光与影的嬉戏 2013-03-14
  • 打赏
  • 举报
回复
再次顶起来!!帮忙看看呢
光与影的嬉戏 2013-03-13
  • 打赏
  • 举报
回复
大家关注下呢!
光与影的嬉戏 2013-03-12
  • 打赏
  • 举报
回复
重新描述下。希望各位大侠帮帮忙

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<table border="0" cellpadding="0" cellspacing="1" style="width: 100%;">
<tr>
<td style="width: 80px" align="right">
年份:
</td>
<td style="width: 50px" align="left">
<asp:DropDownList ID="drpDYear" runat="server" Width="65px" >
<asp:ListItem Value="2014">2014年</asp:ListItem>
<asp:ListItem Value="2013">2013年</asp:ListItem>
<asp:ListItem Value="2012">2012年</asp:ListItem>
<asp:ListItem Value="2011">2011年</asp:ListItem>
<asp:ListItem Value="2010">2010年</asp:ListItem>
<asp:ListItem Value="2009">2009年</asp:ListItem>
<asp:ListItem Value="2008">2008年</asp:ListItem>
</asp:DropDownList>
</td>
<td style="width: 50px" align="right">
月份:
</td>
<td style="width: 50px" align="left">
<asp:DropDownList ID="drpDMonth" runat="server" Width="50px">
<asp:ListItem Value="1">1月</asp:ListItem>
<asp:ListItem Value="2">2月</asp:ListItem>
<asp:ListItem Value="3">3月</asp:ListItem>
<asp:ListItem Value="4">4月</asp:ListItem>
<asp:ListItem Value="5">5月</asp:ListItem>
<asp:ListItem Value="6">6月</asp:ListItem>
<asp:ListItem Value="7">7月</asp:ListItem>
<asp:ListItem Value="8">8月</asp:ListItem>
<asp:ListItem Value="9">9月</asp:ListItem>
<asp:ListItem Value="10">10月</asp:ListItem>
<asp:ListItem Value="11">11月</asp:ListItem>
<asp:ListItem Value="12">12月</asp:ListItem>
</asp:DropDownList>
</td>
<td align="right">
<asp:Button ID="btnSearch" runat="server" Text="搜索" onclick="btnSearch_Click" ></asp:Button>
</td>
</tr>
</table>
<div>
<asp:GridView ID="gridView" runat="server" AllowPaging="True" AutoGenerateColumns="False"
ShowHeader="True" Width="100%" DataKeyNames="Did" ItemStyle-HorizontalAlign="Center"
EmptyDataText="没有找到符合条件的信息">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<input type='checkbox' id='chkAllSelect' name='chkAllSelect' onclick="CheckAll(this)"
runat="server" />
</HeaderTemplate>
<ItemTemplate>
<input type="checkbox" id="chkSelect" name="chkSelect" runat="server" value='<%# Eval("Did")%> ' />
</ItemTemplate>
<ItemStyle Width="20px" />
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
drpDMonth.SelectedValue = DateTime.Now.Month.ToString();
drpDYear.SelectedValue = DateTime.Now.Year.ToString();
btnSearch_Click(null, null);
}
}

/// <summary>
/// //创建列的方法
/// </summary>
/// <param name="dataview"></param>
/// <param name="year"></param>
/// <param name="month"></param>
private void CreateGridviewInit(GridView dataview, int year, int month)
{
int i;
int CurMonthDay = DateTime.DaysInMonth(year, month);
int count = dataview.Columns.Count;
for (i = 1; i < count; i++)
{
dataview.Columns.RemoveAt(1);
}
BoundField newcol1 = new BoundField
{
HeaderText = "姓名",
DataField = "DUserName"
};
newcol1.HeaderStyle.Width = 55;
dataview.Columns.Add(newcol1);
BoundField newcol2 = new BoundField
{
HeaderText = "考勤类型",
DataField = "DAttendanceTypeName"
};
newcol2.HeaderStyle.Width = 150;
dataview.Columns.Add(newcol2);
for (i = 0; i < CurMonthDay; i++)
{
int day;
DateTime tm = new DateTime(year, month, i + 1);
ImageField newcoltp = new ImageField();

switch (tm.DayOfWeek)
{
case DayOfWeek.Sunday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n日";
break;

case DayOfWeek.Monday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n一";
break;

case DayOfWeek.Tuesday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n二";
break;

case DayOfWeek.Wednesday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n三";
break;

case DayOfWeek.Thursday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n四";
break;

case DayOfWeek.Friday:
day = i + 1;
newcoltp.HeaderText = day.ToString() + "\n五";
break;

case DayOfWeek.Saturday:
newcoltp.HeaderText = ((i + 1)).ToString() + "\n六";
break;
}
newcoltp.ItemStyle.Width = 20;
newcoltp.DataImageUrlField = string.Format("DDay{0}", i + 1);
newcoltp.DataImageUrlFormatString = "~/Holiday/{0}.bmp";
dataview.Columns.Add(newcoltp);
}
BoundField newcol4 = new BoundField
{
HeaderText = "本月排休",
DataField = "DTotalDay"
};
newcol4.HeaderStyle.Width = 30;
dataview.Columns.Add(newcol4);
BoundField newcol5 = new BoundField
{
HeaderText = "累计未休",
DataField = "DNoRestDays"
};
newcol5.HeaderStyle.Width = 30;
dataview.Columns.Add(newcol5);
BoundField newcol6 = new BoundField
{
HeaderText = "",
};
dataview.Columns.Add(newcol6);
}

/// <summary>
/// Grid数据绑定
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
private void BindGird(int year, int month)
{
CreateGridviewInit(gridView, year, month);//?
string sql = @" select Did, DUserName, DYear, DMonth, DTotalDay,DNoRestDays,DAttendanceTypeName,
DDay1, DDay2, DDay3, DDay4, DDay5, DDay6, DDay7, DDay8, DDay9, DDay10,
DDay11, DDay12, DDay13, DDay14, DDay15, DDay16, DDay17, DDay18, DDay19, DDay20,
DDay21, DDay22, DDay23, DDay24, DDay25, DDay26, DDay27, DDay28, DDay29, DDay30, DDay31
from TRestInfo
where DYear={0} and DMonth={1}";
sql = string.Format(sql, year, month);

DataTable dt = DbHelperSQL.Query(sql);//查询出数据集合。

gridView.DataSource = dt;
gridView.DataBind();
}
/// <summary>
/// 查询按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSearch_Click(object sender, EventArgs e)
{
int year = Convert.ToInt32(drpDYear.SelectedValue);
int month = Convert.ToInt32(drpDMonth.SelectedValue);
BindGird(year, month);
}


}
}

初始时:三月查询的效果,此时勾选存在,且日期列显示正确。

再次查询二月时的效果,此时勾选也可以,日期列也正确。

再次查询三月 或其他,或再点击查询(及连续两次查询后)勾选丢失

如果创建列的方法放在 if (!Page.IsPostBack),列无法动态变化。

段传涛 2013-03-09
  • 打赏
  • 举报
回复
代码 一会回来看。 先加 if(!ispostback)
光与影的嬉戏 2013-03-08
  • 打赏
  • 举报
回复
引用 3 楼 gxingmin 的回复:
第一列不搞模版咧,也放在动态创建里不可以么?
这个没有试过。看以前一样的问题中解释,这样也会丢失的!
光与影的嬉戏 2013-03-08
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
点击引起页面load,所有元素被重置,如果你是动态创建的,那么就在pageload中,判断ispostback,这样只在第一次创建,其他时候,即使刷新也不会被重置
一样会丢失的
光与影的嬉戏 2013-03-08
  • 打赏
  • 举报
回复
引用 1 楼 wonderfuly 的回复:
在那调用的代码贴 出来。
在查询按钮 点击事件中
我是小李 2013-03-08
  • 打赏
  • 举报
回复
我感觉LZ要实现这样的功能用此方法绕远了。我会选择使用Repeter再嵌套其它控件(如Repeter或者DataList或GridView)来实现这样的功能。只需要实现表头动态绑定然后在绑定事件时根据表头再绑定详细内容来实现。
gxingmin 2013-03-08
  • 打赏
  • 举报
回复
第一列不搞模版咧,也放在动态创建里不可以么?
bdmh 2013-03-08
  • 打赏
  • 举报
回复
点击引起页面load,所有元素被重置,如果你是动态创建的,那么就在pageload中,判断ispostback,这样只在第一次创建,其他时候,即使刷新也不会被重置
游戏人间 2013-03-08
  • 打赏
  • 举报
回复
在那调用的代码贴 出来。

62,073

社区成员

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

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

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

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