动态生成的gridview, 如何获得checkbox模板列选中的值?
在学习动态生成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();
}
}
}