本文主要讲述如何实现在标题头上放一个按钮上去,按下去选择一整个列的功能。用三种方法演示效果。
方法一(较简单):
使用模板列
HTML code < asp:GridView ID ="GridView1" runat ="server" AutoGenerateColumns =False Width ="230px" >
< Columns >
< asp:TemplateField >
< HeaderTemplate >
< asp:Button ID ="Button1" runat ="server" Text ="全选" OnClick ="Button1_Click" />
</ HeaderTemplate >
< ItemTemplate >
<% # Eval ( " id " ) %>
</ ItemTemplate >
</ asp:TemplateField >
< asp:BoundField DataField ="title" />
</ Columns >
</ asp:GridView > C# code protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add( " title " );
dt.Columns.Add( " id " );
dt.Rows.Add( " sdafsa " , " 1 " );
dt.Rows.Add( " sdafsa " , " 2 " );
dt.Rows.Add( " sdafsa " , " 3 " );
dt.Rows.Add( " sdafsa " , " 4 " );
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
protected void Button1_Click( object sender, EventArgs e)
{
Button bt = (Button)sender;
if (bt.Text == " 全选 " )
for ( int i = 0 ; i < GridView1.Rows.Count; i ++ )
{
GridView1.Rows[i].Cells[ 0 ].Style.Add( " background-color " , " red " );
bt.Text = " 取消 " ;
}
else
for ( int i = 0 ; i < GridView1.Rows.Count; i ++ )
{
GridView1.Rows[i].Cells[ 0 ].Style.Add( " background-color " , " white " );
bt.Text = " 全选 " ;
}
}
方法二(中等难度): 在Page_Load中的if (!IsPostBack){}外边动态添加控件
HTML code < asp:GridView ID ="GridView1" runat ="server" Width ="230px" OnRowDataBound ="GridView1_OnRowDataBound" >
</ asp:GridView >
C# code protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add( " title " );
dt.Columns.Add( " id " );
dt.Rows.Add( " sdafsa " , " 1 " );
dt.Rows.Add( " sdafsa " , " 2 " );
dt.Rows.Add( " sdafsa " , " 3 " );
dt.Rows.Add( " sdafsa " , " 4 " );
GridView1.DataSource = dt;
GridView1.DataBind();
}
Button bt = new Button();
//bt.ID = " bt1 " ;
bt.Text = " 测试 " ;
bt.CommandArgument = " 1 " ;
bt.Click += new EventHandler(bt_Click);
GridView1.HeaderRow.Cells[ 1 ].Controls.Add(bt);
}
protected void GridView1_OnRowDataBound( object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
// Button bt = new Button();
// bt.ID = "bt1";
// bt.Text = "测试";
// bt.CommandArgument = "1";
// bt.Click+=new EventHandler(bt_Click);
// e.Row.Cells[1].Controls.Add(bt);
}
}
protected void bt_Click( object sender, EventArgs e)
{
Button bt = (Button)sender;
if (bt.CommandArgument == " 1 " )
for ( int i = 0 ; i < GridView1.Rows.Count; i ++ )
{
GridView1.Rows[i].Cells[ 0 ].Style.Add( " background-color " , " red " );
bt.CommandArgument = " 0 " ;
}
else
for ( int i = 0 ; i < GridView1.Rows.Count; i ++ )
{
GridView1.Rows[i].Cells[ 0 ].Style.Add( " background-color " , " white " );
bt.CommandArgument = " 1 " ;
}
}
第三种(有点难度):
使用viewstate保存序列化后的控件,在创建时再反序列化
HTML code
<asp:GridView ID="GridView1" runat="server" Width="230px" OnLoad="GridView1_Load">
</asp:GridView>
C# code
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("title");
dt.Columns.Add("id");
dt.Rows.Add("sdafsa", "1");
dt.Rows.Add("sdafsa", "2");
dt.Rows.Add("sdafsa", "3");
dt.Rows.Add("sdafsa", "4");
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
protected void GridView1_Load(object sender, EventArgs e)
{
oButton bt = new oButton();
if (ViewState["but"] == null)
{
bt.ID = "bt1";
bt.Text = "测试";
bt.arg = "1";
ViewState["but"] = bt;
}
else
bt = ViewState["but"] as oButton;
bt.Click += new EventHandler(bt_Click);
GridView1.HeaderRow.Cells[1].Controls.Add(bt);
}
protected void bt_Click(object sender, EventArgs e)
{
oButton bt = (oButton)sender;
if (bt.arg == "1")
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridView1.Rows[i].Cells[0].Style.Add("background-color", "red");
bt.arg = "0";
}
else
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridView1.Rows[i].Cells[0].Style.Add("background-color", "white");
bt.arg = "1";
}
ViewState["but"] = bt;
}
这是重点,重写button类,并继承ISerializable接口,以实现button的可序列化:
[Serializable]
class oButton : Button, System.Runtime.Serialization.ISerializable
{
public string arg;
public oButton() { }
protected oButton(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
this.ID = info.GetString("id");
this.Text = info.GetString("txt");
this.arg = info.GetString("arg");
}
public void GetObjectData(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
info.AddValue("id", this.ID);
info.AddValue("txt", this.Text);
info.AddValue("arg", this.arg);
}
}