CommandName 值
说明
“Cancel”
取消编辑操作并将 GridView 控件返回为只读模式。引发 RowCancelingEdit 事件。
“Delete”
删除当前记录。引发 RowDeleting 和 RowDeleted 事件。
“Edit”
将当前记录置于编辑模式。引发 RowEditing 事件。
“Page”
执行分页操作。将按钮的 CommandArgument 属性设置为“First”、“Last”、“Next”、“Prev”或页码,以指定要执行的分页操作类型。引发 PageIndexChanging 和 PageIndexChanged 事件。
“Select”
选择当前记录。引发 SelectedIndexChanging 和 SelectedIndexChanged 事件。
“Sort”
对 GridView 控件进行排序。引发 Sorting 和 Sorted 事件。
“Update”
更新数据源中的当前记录。引发 RowUpdating 和 RowUpdated 事件。
再实现其中的事件即可。
也可以实现RowCommand事件,通过比对CommandName属性值实现方法,但是在其中无法获取cell[?]的值?
GridView中如何控制ButtonField栏的状态?
2007-01-26 16:32<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" >
..........
*******************
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowIndex > -1)
{
DataRowView rv = (DataRowView)e.Row.DataItem;
if (rv["field1"].ToString() == "1")
((LinkButton)e.Row.Cells[0].Controls[0]).Enabled = false;
}
}
1)GridView绑定数据源控件,需要有编辑和删除选项按钮时,数据源控件必须提供SQ操作L语句或存储过程调用,一般,我的推荐做法是,使用无意义的SQL语句或存储过程来使GridView的编辑和删除按钮可以生成,具体的编辑更新和删除操作在代码运行时而不是在控件设计时指定,虽然多写了一点代码,但是对以后的扩展应用是很有好处的,建议所有的数据操作,不管是简单还是复杂的,都使用三层结构,这样从WEB到WIN之间的软件转换将十分轻松. 而且,统一使用三层结构,虽然代码量会多一点,但是可控制性是相当好的,如果组织合理应用统一,这样的做法也是相当高效的.
2)可以指定GridView绑定列的ReadOnly属性为false,这样在编辑生效时,将不会将此列自动设置为textbox形式的可编辑控件.
3)使用GridView控件中的BoundField子控件可以绑定一个数据表的某个字段列,只要将BoundField控件的DataField属性设置为要绑定的数据表的字段名,如果是存储过程select返回的比如@A,那么就将DataField设置成A;并且,可以使用 DataFormatString属性来格式化字段输出,注意,同时要将HtmlEncode属性设置为false;HeaderText属性则是 GridView表现出来的字段名称,一般将其设置为中文字段名;要设置一些其他的样式属性,比如左对齐,背景色等,通过"样式"这个属性来选择设置;另外,如果绑定到字段的数据为空时显示的默认值,则可以通过设置NullDisplayText字段来显示.
4)要设置GridView的主键,可以在其DataKeyNames属性中设置.一般,如果数据源返回5个字段,如果想自动生成列,可使 AutoGenerateColumns为true,如果要有选择的自己设置要显示的列或需要对显示的效果做设置,则先使 AutoGenerateColumns为false,然后在GridView的编辑列选项操作中,自己使用BoundField控件的 DataField属性设置为要绑定的数据表的字段名,并做相应的显示设置即可.
5)GridView有一些常用的事件,我在使用中经常用到的是:RowCommand(只要GridView控件中有按钮按下就会激发,并可找到是 GridView的当前第几行),RowDeleting(删除前,做一些判断或准备工作,我建议直接在此处调用中间业务层的数据操纵服务方法,如果判断结果是删除操作不能进行,则可以设置e.cancel=true,则不会执行数据源控件中指定的SQL语句或存储过程),.RowDeleted(删除后,做一些善后工作),RowUpdating(更新前),RowUpdated(更新后),RowEditing(按编辑按钮时触发),Sorting (排序前),Sorted(排序后),SelectedIndexChanging(选择新行时,还没有做任何新动作前激发), SelectedIndexChanged(选择新行,并执行操作时激发). 需要注重说明的是,所有操作"前"激发的事件,都有"ing"后缀名,这里一般进行一些判断工作,判断操作的条件是否满足,如果满足,则其后执行设计时数据源控件的SQL语句或存储过程,但是,如果条件不满足,则可以使e.Cancel = true,这时将不会继续执行SQL语句和存储过程.
6)一般,ASP.NET控件都有一个专门处理客户端脚本的属性,此属性关联一些javaScript等的脚本代码,这些客户端脚本代码将最优先执行,来进行一些选择或判断,比如:javascript:event.returnValue = window.confirm("你真的想要删除该销售单吗?"),返回true,将正常运行此控件绑定的事件处理程序,如果返回false,则就好象没有点击此控件一样,并不会向下执行服务端代码.
7)GridView内部的一些按钮型控件(ButtonField),点击时触发的处理事件是相同的,可以通过设置CommandName属性的不同字符串来加以区分,如,在RowCommand事件中,可以通过e.CommandName属性来获取点击的特定ButtonField的 CommandName是否与指定的字符串相同,从而进入不同的流程处理.
8)GridView的DataSource属性绑定到集合类型上,如:数组,泛型类,DataSet,DataTable等.而它的 DataSourceID属性则绑定到特定的数据源控件上,如SqlDataSource,ObjectDataSource, XmlDataSource等.然后,调用DataBind()方法具体绑定数据,DataBind()前只是指定数据来源.
9)一个小技巧:当GridView绑定一个对象集合时,如果该对象的公开属性是英文,则GridView的列名也是英文,如果该对象的公开属性是中文, 则GridView的列名也是中文,这个技巧可以不同设置GridView的相关属性而得到中文字段显示的GridView报表.在一些要求特殊的场合还是一个不错的解决方法.
接着,我们来看下如何访问gridview控件中的checkbox控件。经常在gridview控件中,需要给用户多项选择的功能,这个时候就需要使用checkbox控件。首先我们建立一个模版列,其中有checkbox如下:
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
DataKeyNames="PersonID" DataSourceID="mySource" Width="366px" CellPadding="4" ForeColor="#333333" GridLines="None">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="PersonID" HeaderText="PersonID" InsertVisible="False"
ReadOnly="True" SortExpression="PersonID" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:TemplateField HeaderText="Select">
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" />
</ItemTemplate>
<HeaderTemplate>
</HeaderTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
为了示意性地讲解如何得到用户选择的checkbox,可以增加一个按钮,当用户选择gridview中的选项后,点该按钮,则可以输出用户选了哪些选项,在按钮的CLICK事件中写入如下代码:
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row = GridView1.Rows[i];
bool isChecked = ((CheckBox) row.FindControl("chkSelect")).Checked;
if (isChecked)
{
str.Append(GridView1.Rows[i].Cells[2].Text);
}
}
Response.Write(str.ToString());
接下来,我们添加一个全选的选择框,当用户选择该框时,可以全部选择gridview中的checkbox.首先我们在headtemplate中如下设计:
<HeaderTemplate>
<input id="chkAll" οnclick="javascript:SelectAllCheckboxes(this);" runat="server" type="checkbox" />
</HeaderTemplate>
javascript部分的代码如下所示:
<script language=javascript>
function SelectAllCheckboxes(spanChk){
var oItem = spanChk.children;
var theBox=(spanChk.type=="checkbox")?spanChk:spanChk.children.item[0];
xState=theBox.checked;
elm=theBox.form.elements;
for(i=0;i<elm.length;i++)
if(elm[i].type=="checkbox" && elm[i].id!=theBox.id)
{
if(elm[i].checked!=xState)
elm[i].click();
}
}
</script>
在gridview中,经常要访问其中的各类控件,比如dropdownlist,radiobutton,checkbox等,下面归纳下在gridview中访问各类控件的方法。
首先看下如何在gridview中访问dropdownlist控件。假设在一个gridviw中,展现的每条记录中都需要供用户用下拉选择的方式选择dropdownlist控件中的内容,则可以使用如下代码,当用户选择好gridview中的dropdownlist控件的选项后,点击按钮,则系统打印出用户到底选择了哪些dropdownlist控件,并输出它们的值。
public DataSet PopulateDropDownList()
{
SqlConnection myConnection =new SqlConnection(ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString);
SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM tblPhone", myConnection);
DataSet ds = new DataSet();
ad.Fill(ds, "tblPhone");
return ds;
}
上面的代码首先将数据库中tblphone表的数据以dataset的形式返回。然后在页面的itemtemplate中,如下设计:
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# PopulateDropDownList() %>"
DataTextField="Phone" DataValueField = "PhoneID">
</asp:DropDownList>
</ItemTemplate>
这里注意dropdownlist控件的datasource属性绑定了刚才返回的dataset(调用了populatedropdownlist()方法),并要注意设置好datatextfield和datavaluefield属性。
然后,在button的事件中,写入以下代码:
protected void Button2_Click(object sender, EventArgs e)
{
StringBuilder str = new StringBuilder();
foreach (GridViewRow gvr in GridView1.Rows)
{
string selectedText = ((DropDownList)gvr.FindControl("DropDownList1")).SelectedItem.Text;
str.Append(selectedText);
}
Response.Write(str.ToString());
}
这里,我们用循环,来获得每一行的dropdownlist控件的值,并且将值添加到字符串中最后输出。