解决些重复性工作---对GridView的一个扩展方案
2011-04-12 02:25
239 查看
一年多没写代码了,感觉真落伍了,今天想起一个东西,写出来跟大家分享下。
先看图说明:
如图所示,上面两个列表都是gridview创建,其中红色部分两个表都相同,而中间紫色部分根据内容不同而发生改变。以往的工作当中,我都是在gridview当中对所有列进行定义,很明显的对公用部分都做了很多重复性的工作。不知道各位是怎么处理这种情况的?
今天对gridview进行了下扩展,初步出了个思路,下面将方案列出,其中还有些困惑,希望高手能讨论解答。
1、首先创建一个ManagerGridView 类,继承gridview,我这里写在app_code中,自定义控件项目不熟练。
namespace MyControl
{
public class ManagerGridView : GridView
{
public ManagerGridView()
{
}
}
}
2、针对公用列创建两个web 用户控件
(1)索引列 :GvIndex.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GvIndex.ascx.cs" Inherits="UserControl_GvIndex" %>
<%=(this.Parent.Parent as GridViewRow).DataItemIndex+1 %>
(2)操作列 :GvOprate.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GvOprate.ascx.cs" Inherits="GvOprate" %>
<asp:Button ID="btEdit" runat="server" Text="修改" CommandName="EditRow" CommandArgument='<%#Eval("id") %>' />
<asp:Button ID="btDelete" runat="server" Text="删除" CommandArgument='<%#Eval("id") %>'
OnClientClick="return confirm('删除是不可恢复的操作,继续吗?');" CommandName="DeleteRow" />
这里的处理暂时以rowcommand的方式处理,Button加上CommandName
3、在ManagerGridView 中引入两列,这里需要重写GridView的OnInit事件。
protected override void OnInit(EventArgs e)
{
//插入索引列
TemplateField ind = new TemplateField();
ind.ItemTemplate = Page.LoadTemplate("~/UserControl/GvIndex.ascx");
this.Columns.Insert(0, ind);
ind.HeaderText = "序号";
//插入操作列
TemplateField opr= new TemplateField();
opr.ItemTemplate = Page.LoadTemplate("~/UserControl/GvOprate.ascx");
this.Columns.Add(opr);
opr.HeaderText = "操作";
base.OnInit(e);
}
好,扩展暂时告一段落。
4、扩展的使用,以部门管理页面为例 DeptManager.aspx
(1)在页面注册这个控件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DeptManager.aspx.cs" Inherits="Crm_DeptManager" %>
<%@ Register Namespace="MyControl" TagPrefix="Mc" %>
(2)在页面使用控件
<Mc:ManagerGridView ID="GvDept" runat="server"
AutoGenerateColumns="False" Width="600px"
RowStyle-HorizontalAlign="Center" onrowcommand="GvDept_RowCommand" >
<Columns>
<asp:BoundField DataField="PartName" HeaderText="部门名称" />
<asp:BoundField DataField="Description" HeaderText="部门描述" />
</Columns>
</Mc:ManagerGridView>
从上面可以看出,我们只需要在Columns中添加部门名称和描述两列,响应事件添加onrowcommand。
(3)在后台绑定数据,与gridview的用法一样。
(4)处理事件
protected void GvDept_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "EditRow")
{
EdieDepart();
}
else
{
DeleteDepart();
}
}
以上为整个方案的思路,还有很多不完善的地方,欢迎各位提意见。
先看图说明:
如图所示,上面两个列表都是gridview创建,其中红色部分两个表都相同,而中间紫色部分根据内容不同而发生改变。以往的工作当中,我都是在gridview当中对所有列进行定义,很明显的对公用部分都做了很多重复性的工作。不知道各位是怎么处理这种情况的?
今天对gridview进行了下扩展,初步出了个思路,下面将方案列出,其中还有些困惑,希望高手能讨论解答。
1、首先创建一个ManagerGridView 类,继承gridview,我这里写在app_code中,自定义控件项目不熟练。
namespace MyControl
{
public class ManagerGridView : GridView
{
public ManagerGridView()
{
}
}
}
2、针对公用列创建两个web 用户控件
(1)索引列 :GvIndex.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GvIndex.ascx.cs" Inherits="UserControl_GvIndex" %>
<%=(this.Parent.Parent as GridViewRow).DataItemIndex+1 %>
(2)操作列 :GvOprate.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GvOprate.ascx.cs" Inherits="GvOprate" %>
<asp:Button ID="btEdit" runat="server" Text="修改" CommandName="EditRow" CommandArgument='<%#Eval("id") %>' />
<asp:Button ID="btDelete" runat="server" Text="删除" CommandArgument='<%#Eval("id") %>'
OnClientClick="return confirm('删除是不可恢复的操作,继续吗?');" CommandName="DeleteRow" />
这里的处理暂时以rowcommand的方式处理,Button加上CommandName
3、在ManagerGridView 中引入两列,这里需要重写GridView的OnInit事件。
protected override void OnInit(EventArgs e)
{
//插入索引列
TemplateField ind = new TemplateField();
ind.ItemTemplate = Page.LoadTemplate("~/UserControl/GvIndex.ascx");
this.Columns.Insert(0, ind);
ind.HeaderText = "序号";
//插入操作列
TemplateField opr= new TemplateField();
opr.ItemTemplate = Page.LoadTemplate("~/UserControl/GvOprate.ascx");
this.Columns.Add(opr);
opr.HeaderText = "操作";
base.OnInit(e);
}
好,扩展暂时告一段落。
4、扩展的使用,以部门管理页面为例 DeptManager.aspx
(1)在页面注册这个控件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DeptManager.aspx.cs" Inherits="Crm_DeptManager" %>
<%@ Register Namespace="MyControl" TagPrefix="Mc" %>
(2)在页面使用控件
<Mc:ManagerGridView ID="GvDept" runat="server"
AutoGenerateColumns="False" Width="600px"
RowStyle-HorizontalAlign="Center" onrowcommand="GvDept_RowCommand" >
<Columns>
<asp:BoundField DataField="PartName" HeaderText="部门名称" />
<asp:BoundField DataField="Description" HeaderText="部门描述" />
</Columns>
</Mc:ManagerGridView>
从上面可以看出,我们只需要在Columns中添加部门名称和描述两列,响应事件添加onrowcommand。
(3)在后台绑定数据,与gridview的用法一样。
(4)处理事件
protected void GvDept_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "EditRow")
{
EdieDepart();
}
else
{
DeleteDepart();
}
}
以上为整个方案的思路,还有很多不完善的地方,欢迎各位提意见。
相关文章推荐
- 解决些重复性工作---对GridView的一个扩展方案
- 根据自身工作经验总结的一个工作问题解决思路
- 解决一个在国内不能安装chrome扩展的问题
- 新建maven时报错-----------解决:换一个工作空间,或者将工作空间的pom.xm删除
- 解决TCP协议粘包问题的一个简单方案
- 一个页面中多个window.onload = function(){}冲突问题解决方案
- onethink动态扩展菜单中遇到的一个小bug解决思路
- 一个解决方案创建多个项目问题解决方案
- JQuery解决GridView控件翻页问题解决方案!
- 关于VS2010中出现unresolved external symbol _main错误,提供一个可解决的方案
- Eclipse 远程主机强迫关闭了一个现有的连接 问题解决方案
- 制定一个合理可扩展IP地址的分配方案
- ListView中带有CheckBox时,解决CheckBox重复选择问题的一个不错方案
- ECLIPSE切换工作空间,使用插件启动TOMCAT仍启动上一个项目的解决方法
- springMVC中返回json时,日期类型自动转换为long类型的时间戳的处理方案(一个配置解决)
- 提供一个跨浏览器的XML DOM对象解决方案,来自于《javascript高级程序设计》
- 工作对脚本的一个体会,用自己写的脚本解决问题 是一种快感
- 一个解决chrome浏览器下input标签当autocomplete的时候背景变黄色同时input背景图片消失方案
- 错误解决:“GridView1”上同时定义了 DataSource 和 DataSourceID。请移除一个定义。
- 突出一个简单粗暴!Android Activity泄漏问题解决方案