个人觉得当然是GridView好了,GridView是.NET2.0时出来的,是DataGrid的升级版,所以vs.net2003之后的版本在工具栏已经看不到DataGrid.不过微软还是保留了它,使用它得敲打代码 .许多人都用惯了DataGrid,可能会觉得GridView不好用,其实GridView有许多优点而且方便,了解它以后你会喜欢它的.
GridView的特点:
而DataGrid就没有这么多细化了的功能.
以下列举一些在数据绑定事件中GridView的优点和DataGrid相比之下的不足吧:
1.DataControlRowType
在GridView的RowDataBound事件,能够用DataControlRowType来判断当前所绑定的是header行还是data行等,如:DataControlRowType有DataRow,EmptyDataRow,Header,Footer,Pager等属性,
成员名称 | 说明 | |
---|---|---|
DataRow | 数据控件的数据行。只有 DataRow 行能绑定数据。 | |
EmptyDataRow | 显示页按钮或页导航控件的行。页导航行不能绑定数据。 | |
Footer | 数据控件的脚注行。脚注行不能绑定数据。 | |
Header | 数据控件的标题行。标题行不能绑定数据。 | |
Pager | 显示页按钮或页导航控件的行。页导航行不能绑定数据。 | |
Separator | 行分隔符。行分隔符不能绑定数据。 |
而DataGrid是靠ListItemType的EditItem,Item,AlternatingItem等属性来区分当前是怎样的行,其实上DataGrid针对是Item,不是row.
2.DataControlRowState
DataControlRowState 有Alternate,Edit,Insert,Normal,Selected属性
成员名称 | 说明 | |
---|---|---|
Alternate | 指示该数据控件行是交替行。 Alternate 状态在任何时候都可以与其他状态组合,例如与 Normal、Edit 或 Insert 组合。这些行可能会受到数据控件的 AlternateRowStyle 属性影响(若已设置)。 |
|
Edit | 指示该行处于编辑状态,这通常是单击行的“编辑”按钮的结果。通常,Edit 和 Insert 状态互相排斥。 | |
Insert | 指示该行是新行,这通常是单击“插入”按钮添加新行的结果。通常,Insert 和 Edit 状态互相排斥。 | |
Normal | 指示该数据控件行处于正常状态。Normal 状态与其他所有状态互相排斥。 | |
Selected | 指示该行已被用户选定 |
如果GridView要找出哪一行处理编辑状态,可以这样的条件来判断:((e.Row.RowState & DataControlRowState.Edit) != 0)
而DataGrid用是ListItemType.EditItem来判断,将type跟state的概念混在一起了.
3.e.Row
GridView的e.Row可以被转换成DataRow类型,这样就方便取得绑定在GridView里每行的数据了,如((DataRow)e.Row)["CompanyId"]. 而DataGrid不能这样转换,只有e.Item.DataItem可用,要取得绑定数据需要用DataBinder.Eval方法,如DataBinder.Eval(e.Item.DataItem, "r_CompanyId").
4.Keys、OldValues、NewValues集合
Keys字典中一般存放的是数据源中的主键字段的key和value的对应值,如果主键由多个字段组成,那么Keys为每个键字段添加其字段名称和值。OldValues中存放的是要更新的行的字段名和原始值,每个字段为其中的一项。NewValues中存放的是要更新的行的字段名和修改后的值,每个字段为其中的一项。注意,主键字段只存放于keys集合中。
这三个集合中的每一项都是DictionaryEntry类型的对象,我们可以用DictionaryEntry.Key来确定一个项的字段名称,用DictionaryEntry.Value来确定某项的值。
在上面的例子中,为了把密码明文加密后再存入数据库,我们利用了NewValues字段,重新设置key为password的项的值。为了保证安全性,我们在更新数据前对NewValues中的所有值进行html编码:
Example1:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//遍历NewValues,取得其中每一对DictionaryEntry对象
foreach (DictionaryEntry de in e.NewValues)
//de.key就是字段名,如果此处单独更新某字段的话,也可以直接填写字段名,//比如 e.NewValues[“password”]
e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());
}
Example2:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//分别利用Keys、OldValues、NewValues取得主键名、原始数据和更新后数据
Message .Text = e.Keys["username"] + "的email地址从" + e.OldValues["email"] + "变更为" + e.NewValues["email"];
}
DataGrid没有这些.
http://www.techmango.com/blog/article.asp?id=475