动态GridView,动态模板列CheckBox,取值问题

forum2621 2009-12-04 05:06:52
由于需求原因需要在后台生成GridView并增加一个CheckBox列。这个CheckBox取不到值...查了半天资料也折腾了半天了,还是没什么效果。

上代码:

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;

public partial class Default3 : System.Web.UI.Page
{
protected GridView gridview;
protected Button button;
protected Label label;

protected void Page_Load(object sender, EventArgs e)
{

}
protected override void CreateChildControls()
{
base.CreateChildControls();

gridview = new GridView();
gridview.AutoGenerateColumns = true;
gridview.DataSource = GetDataTable();
gridview.DataKeyNames = new string[] { "number" };

////加载checkbox
TemplateField tfColumn = new TemplateField();
tfColumn.HeaderText = "";
tfColumn.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
gridview.Columns.Add(tfColumn);

gridview.DataBind();
Controls.Add(gridview);

label = new Label();
label.Text = "This is Label..";
Controls.Add(label);

button = new Button();
button.Text = "测试";
button.Click += new EventHandler(button_Click);
Controls.Add(button);
}

protected DataTable GetDataTable()
{

DataTable dt = new DataTable("cart");
DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16"));
DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16"));
DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64"));
DataColumn dc5 = new DataColumn("mm", Type.GetType("System.Boolean"));

dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
dt.Columns.Add(dc5);

for (int i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
dr["prizename"] = "中国";
dr["point"] = 10;
dr["number"] = i;
dr["totalpoint"] = 10;
dr["mm"] = true;
dt.Rows.Add(dr);
}
return dt;


}
public void button_Click(object sender, EventArgs e)
{
try
{
label.Text += "<br>start";
int k = 0;
foreach (GridViewRow gvr in gridview.Rows)
{
label.Text += "k="+k;
K++;
if (gvr.RowType == DataControlRowType.DataRow)
{
CheckBox ch = (CheckBox)gvr.FindControl("CheckBox1");

if (ch != null)
{
label.Text += ch.Checked + "<br>";
//if (ch.Checked == true)
//{
// label.Text += ch.Checked;
//}
}
}
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());

}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
}
public class MyTemplate : ITemplate
{
private string strColumnName;
private DataControlRowType dcrtColumnType;

public MyTemplate()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
//// <summary>
/// 动态添加模版列
/// </summary>
/// <param name="strColumnName">列名</param>
/// <param name="dcrtColumnType">列的类型</param>
public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
{
this.strColumnName = strColumnName;
this.dcrtColumnType = dcrtColumnType;
}

public void InstantiateIn(Control ctlContainer)
{
switch (dcrtColumnType)
{
case DataControlRowType.Header: //列标题
Literal ltr = new Literal();
ltr.Text = strColumnName;
ctlContainer.Controls.Add(ltr);
break;
case DataControlRowType.DataRow: //模版列内容——加载CheckBox
CheckBox cb = new CheckBox();
cb.ID = "CheckBox1";
cb.Checked = false;
ctlContainer.Controls.Add(cb);
break;
}
}
}





...全文
1198 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
a864610877 2011-08-05
  • 打赏
  • 举报
回复
楼主能不能将代码贴出来看一下啊,我也遇到了这样的问题
liuyan351677394 2011-04-06
  • 打赏
  • 举报
回复
加 if (!IsPostBack)
{} 就有值了
panmeichen 2010-04-09
  • 打赏
  • 举报
回复
gridview.DataBind();
Controls.Add(gridview);

label = new Label();
label.Text = "This is Label..";
Controls.Add(label);

button = new Button();
button.Text = "测试";
button.Click += new EventHandler(button_Click);
Controls.Add(button);

只要所有的Controls前加this.Form1.即可.
forum2621 2009-12-07
  • 打赏
  • 举报
回复
兄弟们,帮忙啊
forum2621 2009-12-07
  • 打赏
  • 举报
回复
这边有个参考,他最后是在OnInit事件中解决了,我试了,没成功,继续测试...
http://topic.csdn.net/u/20080618/12/b62793ad-0666-4cae-8110-e7ca33fb1479.html
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 itdc_yiwang 的回复:]
那你要在页面上放1个HIDDENFIELD用来存放你取出来的值,不然一翻页什么的就没了
[/Quote]

关键是我的程序现在没有页面(我写sharepoint里边的webpart),有页面我也不用后台写了...
ITDC_YiWang 2009-12-07
  • 打赏
  • 举报
回复
那你要在页面上放1个HIDDENFIELD用来存放你取出来的值,不然一翻页什么的就没了
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenjianyong94 的回复:]
CheckBox 出来没有嘛???出来了就有办法解决了。 在说明一下,取出checkbox 执行删除还是什么功能。。??
[/Quote]
CheckBox当然可以出来了,就是点了按钮就刷新了,原有的值就没有了。我取CheckBox就是判断是否选中,然后再做一些其他事情了...
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sk_aqi 的回复:]
貌似,动态生成的不可以获得吧?
[/Quote]
可以获得的,你在aspx页面的控件后台也是要编译的,我还没搞清楚它什么时候编译(据说在OnInit事件时),如果知道了直接在后台写就可以了。
chenjianyong94 2009-12-07
  • 打赏
  • 举报
回复
CheckBox 出来没有嘛???出来了就有办法解决了。 在说明一下,取出checkbox 执行删除还是什么功能。。??
SK_Aqi 2009-12-07
  • 打赏
  • 举报
回复
貌似,动态生成的不可以获得吧?
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenjianyong94 的回复:]
想要干什么都没说清楚,不好处理。,
[/Quote]

我的要求就是取那个Gridview里边第一列CheckBox是否选中。
Gridview和CheckBox全是动态生成的。
chenjianyong94 2009-12-07
  • 打赏
  • 举报
回复
想要干什么都没说清楚,不好处理。,
forum2621 2009-12-07
  • 打赏
  • 举报
回复
UP
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 thanktheworld 的回复:]
不用设置autopost;
你按我给你说的那个方法再建个专门用来保存变量的类,里面设置一个static静态的变量。
[/Quote]

我自己搞定了,虽然不是我期望的结果。
参照15楼:
页面放个HiddenField;生成的CheckBox采用 HtmlInputCheckBox,把想要的数据,比如id绑到CheckBox的value上,用js获取CheckBox的value,并为HiddenField赋值,后台取HiddenField的值在做处理即可。


先做个出来,等有时间了我再来研究如何在oninit里边实现,郁闷....
thanktheworld 2009-12-07
  • 打赏
  • 举报
回复
不用设置autopost;
你按我给你说的那个方法再建个专门用来保存变量的类,里面设置一个static静态的变量。
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 thanktheworld 的回复:]
protected void CboxSelect_CheckedChanged(object sender, EventArgs e)
[/Quote]
这个是不是就要打开checkbox的autopost功能,如果打开了,点下就刷新了,体验效果那就不说了...

另外,你的代码我试了,在我这,没通过。还是取不到是否被选中状态
你可以试下我发的代码...
thanktheworld 2009-12-07
  • 打赏
  • 举报
回复
哦,就是用来保存变量的另外一个类:

public class MessageManager
{
/// <summary>
/// IDList属性用来储存LookMessage.aspx中的CheckBox所选中行的ID
/// </summary>
private static ArrayList iDList;

public static ArrayList IDList
{
get { return MessageManager.iDList; }
set { MessageManager.iDList = value; }
}

你也可以在自己的类里定义一个静态的变量,都一个意思。
forum2621 2009-12-07
  • 打赏
  • 举报
回复
MessageManager 这个是自己写的还是系统的,本人刚学asp.net没多久,好多api还不熟悉呢
forum2621 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 thanktheworld 的回复:]
我的项目都能运行,当然是可以的。
你咋不接贴啊朋友。
[/Quote]

呵呵,我再继续测试中。多谢啊
加载更多回复(15)

62,254

社区成员

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

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

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

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