动态生成的gridview, 如何获得checkbox模板列选中的值?

dalofal 2016-10-08 09:52:37
在学习动态生成gridview,借鉴了别人的代码,为方便测试没有从数据库里取数而是直接代码里添加了。然而别人代码只有生成模板列(checkbox)但没有取值,所以想请教下,后台怎知道哪行被勾选了,如果有功能完整的代码例子更好,非常感谢!

前台代码:

<body>
<form id="form1" runat="server">
<div>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="5"
OnPageIndexChanging="GridView1_PageIndexChanging" >
</asp:GridView>

<br />
<asp:Button ID="Button1" runat="server" Text="取 值" OnClick="Button1_Click" />
<br />

</div>
</form>
</body>

后台代码:

namespace gridview
{
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
BindData();
}

}

/// <summary>
/// 绑定gridview
/// </summary>
public void BindData()
{

DataTable dt = new DataTable();

System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("Category", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("商品", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("Price", typeof(System.Double)));
dt.Columns.Add(new System.Data.DataColumn("sales", typeof(System.Double)));
System.Random rd = new System.Random();
for (int i = 1; i < 16; i++)
{
dr = dt.NewRow();
dr[0] = "C-" + Math.Ceiling(Convert.ToDecimal(i/2)).ToString() ;
dr[1] = "【X - " + i.ToString() + " -X】";
// dr[2] = System.Math.Ceiling(rd.NextDouble() * 100);
dr[2] = i * 3;
dr[3] = System.Math.Ceiling(rd.NextDouble() * 100);
dt.Rows.Add(dr);
}

GridView1.AutoGenerateColumns = false;//设置自动产生列为false
GridViewBind(GridView1, dt);
}

/// <summary>
/// 绑定生成GridView
/// </summary>
/// <param name="gdv">要绑定的GridView</param>
/// <param name="dtblDataSource">GridView的数据源</param>
/// <param name="strDataKey">GridView的DataKeyNames</param>
public static void GridViewBind(GridView gdv, DataTable dtblDataSource)
{
gdv.Columns.Clear();

gdv.AutoGenerateColumns = false;
gdv.DataSource = dtblDataSource;
// gdv.DataKeyNames = new string[] { strDataKey };


HyperLinkField hk = new HyperLinkField();

hk.DataNavigateUrlFields = new string[] { "Category","Price" };

hk.HeaderText = "类目";
hk.ControlStyle.Width = new Unit(100);
hk.DataTextField = "Category";

hk.DataNavigateUrlFormatString = "newpage.aspx?ca={0}&p={1}";

for (int i = 0; i < dtblDataSource.Columns.Count; i++) //绑定普通数据列
{
BoundField bfColumn = new BoundField();
bfColumn.DataField = dtblDataSource.Columns[i].ColumnName;
bfColumn.HeaderText = dtblDataSource.Columns[i].Caption;

if (bfColumn.HeaderText == "Category")
{
gdv.Columns.Add(hk);

}
else
{
gdv.Columns.Add(bfColumn);
}

}

//添加包复选框的模板列
TemplateField tf = new TemplateField();
tf.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
//tf.HeaderText = "选择";
tf.HeaderTemplate = new MyTemplate("模版列-选择框", DataControlRowType.Header);
tf.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
gdv.Columns.Add(tf);

gdv.DataBind();//绑定


}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindData();
}

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;

}
}

}

protected void Button1_Click(object sender, EventArgs e)
{
// 取类目和商品名称


BindData();
}

}
}
...全文
358 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fleetingevent 2016-10-11
  • 打赏
  • 举报
回复
你是在gridview里面实现了checkbox?
dalofal 2016-10-09
  • 打赏
  • 举报
回复
repo下, 懂的人还请不吝写几句代码吧,底子太弱琢磨不会
蝶恋花雨 2016-10-08
  • 打赏
  • 举报
回复
http://www.cnblogs.com/qfcndtt/archive/2011/04/18/2019959.html http://blog.csdn.net/junboyboy/article/details/17922037 SelectedIndexChanged 事件中写 也可以 放个隐藏域,或者按钮来实现
dalofal 2016-10-08
  • 打赏
  • 举报
回复
引用 1 楼 closurer 的回复:
PostBack 的时候就知道哪行被勾选了。
没代码,还是解决不了问题
闭包客 2016-10-08
  • 打赏
  • 举报
回复
PostBack 的时候就知道哪行被勾选了。
dalofal 2016-10-08
  • 打赏
  • 举报
回复
引用 3 楼 kongwei521 的回复:
http://www.cnblogs.com/qfcndtt/archive/2011/04/18/2019959.html http://blog.csdn.net/junboyboy/article/details/17922037 SelectedIndexChanged 事件中写 也可以 放个隐藏域,或者按钮来实现
参照试了,但是都没成功,比较笨。 button 执行过程取不回 RowCommand的值。 public string s; protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { foreach (GridViewRow Gvr in GridView1.Rows) { CheckBox Cbx = (CheckBox)Gvr.FindControl("CheckBox1"); if (Cbx.Checked) { s += Gvr.Cells[1].Text ; } } }

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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