随心所欲

做个幸福的人
posts - 147, comments - 1402, trackbacks - 28, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

 

Asp.netGridView只能进行单行编辑(设置EditIndex),相比之下,这个控件则可以进行多行同时编辑。同时还能进行多行插入。再配合DataSource控件,真的比较好用。

1:配合DataSource控件使用

2:多行编辑

3:多行插入

4:处理修改/插入事件

5:分页

6:模板的使用

7:小扩展

 

这是一个运行效果图。


这是下载地址:http://www.codeplex.com/ASPNetRealWorldContr/Release/ProjectReleases.aspx?ReleaseId=1674

 

配合使用Datasource控件。

再提供的例子里面,数据源使用的是SqlDataSource控件。配置好sql语句就可以了。因为我的用例里面多数都是使用ORM的,所以我用了另外一种DataSource控件。这个数据源控件的好处是对分页支持非常好,可以直接内置在对象的sql语句里面,真的可以做到数据库分页和UI分页结合。

因为设计的关系,如果不使用DataSource控件,将很难使用到多行插入的功能。

    private void InsertRow(int rowIndex, bool causesValidation)

        {

            GridViewRow row = null;

 

            if ((!causesValidation || (this.Page == null)) || this.Page.IsValid)

            {

                DataSourceView dsv = null;

                bool useDataSource = base.IsBoundUsingDataSourceID;

                if (useDataSource)

                {

                    dsv = this.GetData();

                    if (dsv == null)

                    {

                        throw new HttpException("DataSource Returned Null View");

                    }

                }

….

多行编辑

其实这个控件把所有行都变成了编辑状态。这种用例可能在某些场合非常有用。

BulkEditGridView直接提供一个DirtyRows的属性,把修改行触发事件。

    protected void BulkEditGridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

        //user logic here.

        string s = e.NewValues["Manhour"].ToString().Trim();

        if (s == "0" || s == "")

            e.Cancel = true; //can do the cancel here.

        else

        {

            e.NewValues["Amount"] = 100;//test reset some value

        }

    }

这样,就可以得到数据了。

如果不使用Datasource控件,需要做些特别的处理

   if (EditableGrid.DirtyRows[EditableGrid.DirtyRows.Count-1].RowIndex == e.RowIndex)

            BindData();

这样做的原因是:修改完成之后要重新绑定数据,而这个事件会被重复触发,所以一定要判断出来是不是最后一次触发这个事件,要不然直接绑定新数据的话会把其他行覆盖掉。

多行插入

这个功能看起来比较有意思:一个GridView下边会有多个新行以供用户书写新的数据。用户可以设置现实多少个新行。

不过这个功能感觉多有不方便的地方。比方说:

1:很难得到新行的GridViewRow属性。解决方法是自己扩展GridViewInsertEventArgs类。

   这种调用失败:(EditableGrid.Rows[args.RowIndex].Cells[0].Controls[0] as TextBox).Text

2:无法得到新行创建的事件。在OnRowCreted事件里面只有普通行的,找不到新行的创建事件。他的实现里面是这样的:this.InnerTable.Rows.AddAt(index, row);

在提供的新的事件里面,我们可以处理插入:

    protected void BulkEditGridView1_RowInserting(object sender, RealWorld.Grids.GridViewInsertEventArgs args)

    {

        string s = args.NewValues["Manhour"].ToString().Trim();

        if (s == "0"||s=="")

            args.Cancel = true;

        else

        {

            //args.Row is my New GridViewInsertEventArgs property.

            DropDownList list = args.Row.FindControl("DropDownList1") as DropDownList;

            string x = list.SelectedValue;

        }

    }

注意:上边的args.Row是我自己扩展出来的。

这个事件也会循环触发。

分页

我使用的是一个DataSource控件,所以处理分页正好使用。因为BulkEditGridView控件本身就继承自GridView,所以分页,排序等功能继续使用没有问题。

模板列

GridView的模板列可以继续使用。但是在InsertRow的时候需要自己做一些扩展(原因就是上边说的无法得到当前事件Row的参数的问题)。

1:无法得到当前事件Row的参数的问题。这个可以通过扩展GridViewInsertEventArgs类来实现,上边已经说了。

2:无法得到新建row的创建事件的问题。这个也需要自己做一些扩展。主要是在int index = this.InnerTable.Rows.Count - (this.ShowFooter ? 1 : 0);

            this.InnerTable.Rows.AddAt(index, row);附近,自行触发一个事件。

这种情况可能出现在:设置了模板,但是无法控制InsertRow里面的某些非数据绑定控件(Dropdownlist或者其他)。

其他

DropDownField类:这是提供的一个可以绑定列表的绑定列。类似的自己可以扩展其他绑定列。

 

附,扩展之后的GridViewInsertEventArgs

 

GridViewInsertEventArgs

Feedback

#1楼    回复  引用  查看    

2007-04-26 18:00 by neuhawk      
我是用gridview+模板列实现

#2楼    回复  引用  查看    

2007-04-27 10:47 by 留云      
我照你的例子做的怎么修改不了数据库啊

#3楼 [楼主]   回复  引用  查看    

2007-04-27 11:22 by 随心所欲      
@neuhawk
也是不错

#4楼 [楼主]   回复  引用  查看    

2007-04-27 11:22 by 随心所欲      
@随心所欲
修改数据库用的是DataSourceControl来实现的。你用的哪一个控件呢?

#5楼    回复  引用  查看    

2007-04-27 13:26 by 留云      
你好啊 有没有例子啊

#6楼 [楼主]   回复  引用  查看    

2007-04-27 18:18 by 随心所欲      
@留云

原来的demo没找到。我自己做的是用另外的Datasource控件,所以不做数。
自己做一点demo,效果更好。

#7楼    回复  引用  查看    

2007-04-28 09:14 by 留云      
你好 有没有 msn 呢 这样可以方便的向你请教问题

#8楼 [楼主]   回复  引用  查看    

2007-04-28 11:51 by 随心所欲      
@留云
可惜大部分时间我都上不了MSN。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接:
 
Google