Infragistics UltraWebGrid 控件的增删改查(CRUD)之非Batch更新操作

Infragistics UltraWebGrid 控件的增删改查(CRUD)

之前没怎么接触UltraWebGrid控件,以为它与普通的GridView控件差不多,不知道是不是我先天迟钝呢,还是怎样,为了弄它这个增删改功能,到处百度、Google,关于这个的资料有是有,但很少,而且大部分是英文的,虽然Infagistics本身也提供Samples来参考,但看着那一大堆非我想要的代码示例,让我觉得很无奈,因为我用的V8.2版本,与现在最新的2010版本也有些差异,它网站上的help大都以最新的为例,哈哈,无奈之下,还是认真地啃下文档的英文解说,然后再与本身的实例做对比,经过一个星期的测试比较,终于将增删改的功能实现出来。为了给广大同志们一个help,少走些弯路,现在将这个功能的实现总结出来:

实现增删改查(CRUD)在UltraWebGrid中主要分为两种类型,一种是单个(Single)的实现,它的意思就是你修改或是增加或是删除都是以为一个为单位进行Postback,返回到服务器中,更新到数据库。另一种呢是在前面单个(Single)的基础上提出来的,就是批量更新(Update Batch),在批量更新条件下,你要在自己的Web Form程序中添加一个Run at Server的Button按钮,不用设置Button按钮的事件,它只是起到一个按钮作用,实际什么都不做的。

好的,我们来看看实现CRUD功能的大概步骤:

1、设置数据源,这里我们用DataSet数据集来设置数据源,并利用它的向导来设置各种参数(包括SQL)

2.在CS文件中写好各种事件的处理代码,如UpdateRow,DeleteRow等等

3.在Aspx文件中选中UltraWebGrid,在属性中转换到事件标签,然后将相关事件关联起来,如UpdateRowEventHander关联到我们在CS写的UpdateROW事件中,其实就是在这里让我蒙了好长时间,我当时就不明白它怎样将事件代码关联起来的,后来才弄明白它UltraWebGrid控件本身提供这样的事件控制机制,而我们要做的是写好事件的代码,然后在设计面板中将事件与事件代码关联起来就行了,很是简单,当然习惯了自己手写控制一切有时候思维还是转不过来啊。

以下呈现出来的是具体的操作步骤:(以下为非批量Batch的单个Single的CRUD实现,部分格式参照文档的格式,因为文档的格式容易让人思路清晰明了)

1、新建一个WebSite站点(当然,你也可以不新建,直接在自己的项目上应用,但为了测试成功与否,还是建议阁下这样做,不会建立站点?在vs中的文件->新建->网站)

2、再把你的数据库文件复制到项目的App_Data文件夹下,然后回到VS平台,在解决方案资源管理器选项卡下,右击App_Data文件夹,选择添加-》现有项,找到刚才在App_Data文件夹下的数据库文件(我这里是LinqDB.mdf,以下的说明都以这个为蓝本,当然你也可以换成你的数据库文件,我这里只是做示例,噢,忘记废话一点了,要能正常使用这个数据库文件,你要安装有Sql Server才行喔,我这里是SQLServer2008sp1版本,再八卦一下,如果你不用数据库文件的话,也可以直接访问sql server里面的现存的数据库),点击“添加”按钮即可。

clip_image001[5]

3、创建数据库的数据访问层,右击解决方案的工程节点,选择“添加”-》新建项,在模板栏中,我们选择“数据集”

clip_image003[16]

此时注意,在“名称”一栏中,默认为“DataSet1.xsd”,当然你也可以自己命名,但要记住文件名(这里是DataSet1),下面写代码时会用到,然后点添加即可(注意,有时候你添加这个数据集时,会出现提示说一般将数据集放在App_Code文件夹下,这时选择”是“)

在DataSet设计模式下,在工具箱中,拖动TableAdapter控件到数据集里面,

clip_image005[9]

此时会出面“TableAdapter配置向导”,此时向导会自己搜索已存在的数据库,可能也存在没有找到或是空白的情况,这时你要自己新建连接,点击右边的“新建连接”按钮,新建连接我就不说了啊。下一步吧

clip_image007[6]

一般此时要求你要选择客串连接的名称,这里默认是数据库名+ConnectionString,当然你也可以自己命名,到时使用连接字符串时你记住就行了。这里的是LinqDBConnectionString,下一步。

clip_image008[8]

选择命令类型,默认“使用SQL语句”,下一步

clip_image009[6]

到了“输入SQL语句”,点击“高级选项”

clip_image011[6]

选择“生成Insert,Update,Delete语句”,点确定,再点查询生成器

clip_image012[13]

查询生成器会找到LinqDB数据库的表集,选中你要操作的表,点添加,这里是Category表,添加后,点关闭,然后选择你要查询的属性(字段)自动生成SQL语句,当然你也可以在下面的SQl语句文本框中手写语句,这里选择所有列(这里一定要保证你所查询的列中有主键,这里的主键是ID,至于为什么,下面会提到), clip_image014[6]

可以在下面的“执行查询”来看效果,

clip_image016[7]

点确定,在这里默认Fill,GetData方法,直接下一步,

clip_image018[7]

然后,自动的操作已经列出来了

clip_image020[6]

点完成,这时会回到dataset设计器里面

clip_image021[7]

看到这个界面的时候,你已经完成很大一部分工作了,但这时为了我们实现更新数据时,还要添加一个方法,在“CategoryTableAdapter”右击,点击“添加查询”,

clip_image023[7]

与前面的有点类似,使用SQL语句,下一步,

clip_image025[7]

默认Select(返回行),下一步,

clip_image027[7]

出现查询生成界面,我们手写SQL语句,改为如下

clip_image028[7]

即添加Where ID=@ID语句,这里主键是ID,所以添加ID,为什么这样做呢,是因为在你修改还有删除等等操作,在客户端定位时,如果返回到数据库里面?肯定是使用主键嘛,所以,在刚才配置的时候我说在查询列时一定要保证有主键,不然你更新不了,@ID在这里只是参数。点下一步,

在生成的方法中与之前的不同,都有by后缀,即FillBy,GetDataBy,我们这里改为FillByID,GetDataByID(为什么要改?可以不改的,这里只是为了好记)

clip_image029[8]

点下一步,再点完成

clip_image030[7]

看到没?已经出现第二个方法了。

至此,数据层已经配置好了。

4.在Default.aspx文件中添加Ultrawebgrid控件,出现Design向导,直接OK默认就行了(这里只是展示数据操作,界面设计的话自己灵活处理)。

5.打开Default.aspx.cs文件,添加必要的引用,删除掉已经存在的using引用,添加如下引用:

clip_image031[4]

特别是最后一个引用,using DataSet1TableAdpters, DataSet1就是之前要你记住的数据集文件名了再加上TableAdpters,即DataSet1+TableAdpters就可以引用我们之前第三步骤所做的数据层了。

6. 写代码

public partial class _Default : System.Web.UI.Page

{

DataSet1 theds3=new DataSet1();///实例化数据集

CategoryTableAdapter theTableAdapter = new CategoryTableAdapter();

/////实例化适配器,在Dataset1中有多少个表,就有多个个这样的适配器,在这里现在只有一个Category表,所以只有这个CategoryTableAdapter适配器,这些适配器都是表名+TableAdapter构成的,这些适配器用来做什么的呢?就是用来执行CRUD到数据库中,不然你在客户端所有操作都是徒劳的

protected void Page_Load(object sender, EventArgs e)

{///在Page_Load添加如下代码

if (!Page.IsPostBack)

{

this.GetData();////初始数据

}

}

public void GetData()////初始数据函数

{

this.UltraWebGrid1.Rows.Clear();////清空UltraWebGrid中的显示

this.theTableAdapter.Fill(theds3.Category);///将数据库Category表中的数据填充到数据集theds3中

this.UltraWebGrid1.DataSource = theds3.Category;///以下是将控件UltraWebGrid的数据源绑定到表中

this.UltraWebGrid1.DataBind();

}

/////以下是写删除行代码,注意函数名称和参数啊

protected void UltraWebGrid1_DeleteRow(object sender, RowEventArgs e)

{

////设置主键,通过它来控制是哪行被删除了

int thePrimaryKey = (int)e.Row.Cells.FromKey("ID").Value;

///然后操作返回到数据集表中

this.theTableAdapter.FillByID(theds3.Category, thePrimaryKey);

/////声明表的一行,初始为null

DataSet1.CategoryRow theCategory = null;

////以下if作用不明显

if (theds3.Category.Count > 0)

{

theCategory = theds3.Category[0];

}

try

{

if (theCategory != null)////如果数据行存在

{

theCategory.Delete();///删除之

this.theTableAdapter.Update(theds3.Category);/////更新到数据库

}

}

catch (Exception ex)////看看有没异常,有就抛出异常

{

this.lblerror.Text = ex.Message;

this.GetData();

}

}

//////以下是更新操作,包括修改更新和增加行更新

protected void UltraWebGrid1_UpdateRow(object sender, RowEventArgs e)

{

switch (e.Row.DataChanged)/////查看引发事件的行的状态,是增加的还是修改过的

{

case DataChanged.Added:

this.InsertRecord(e.Row);

break;

case DataChanged.Modified:

this.UpdateRecord(e.Row);

break;

}

}

//////增加行数据

private void InsertRecord(UltraGridRow theGridRow)

{

DataSet1.CategoryRow theCategory;///声明一(表)行

theCategory = theds3.Category.NewCategoryRow();//实例化,注意这里,要实例化成你要操作的表的行数据

theCategory.ID = (int)theGridRow.Cells.FromKey("ID").Value;///对应各数据项的内容,哈哈,这里面的格式,自己研究,也可以参考我的这里的代码,基本上一样,而且也容易懂

theCategory.Name = theGridRow.Cells.FromKey("Name").Value.ToString();

theCategory.ParentID = (int)theGridRow.Cells.FromKey("ParentID").Value;

/////向数据集中相应的表,这里是Category表,增加一行

theds3.Category.AddCategoryRow(theCategory);

/////更新到数据库

this.theTableAdapter.Update(theds3.Category);

theGridRow.Cells.FromKey("ID").Value = theCategory.ID;

}

///////更新行数据,即是修改过的行

private void UpdateRecord(UltraGridRow theGridRow)

{

/////获取主键,以标识是哪条记录修改了

int thePrimaryKey = (int)theGridRow.Cells.FromKey("ID").Value;

this.theTableAdapter.FillByID(theds3.Category, thePrimaryKey);

//////同上

DataSet1.CategoryRow theCategory = null;

if (theds3.Category.Count > 0)

{

theCategory = theds3.Category[0];

}

//////更新到数据集中

if (theCategory != null)

{

theCategory.Name = theGridRow.Cells.FromKey("Name").Value.ToString();

theCategory.ParentID = (int)theGridRow.Cells.FromKey("ParentID").Value;

theCategory.ShowOrder = (int)theGridRow.Cells.FromKey("ShowOrder").Value;

}

////////将数据集中的修改更新到数据库中

this.theTableAdapter.Update(theds3.Category);

}

}

7.写完代码后,转到Default.aspx页面,选中UltraWebGrid控件,在属性栏中,点击闪电按钮转到事件标签下,将DeleteRow关联到Ultrawebgrid1_DeleteRow函数中去,同理UpdateRow关联到UltraWebGrid1_UpdateRow中去

clip_image033[8]

clip_image035[7]

至此,所有步骤已经完毕了,现在就可以调试下,运行效果啊.

转载请保留原文地址http://www.cnblogs.com/lusir/archive/2010/08/01/1790029.html

posted @ 2010-08-01 17:44  lusir  阅读(1698)  评论(0编辑  收藏  举报