一个相当独立的.通用分页控件c#源码四(downmoon收集)

C#自定义分页控件 一、AspNetPager支持两种方式分页: 一种是PostBack方式分页, 一种是通过Url来实现分页以及Url重写功能 二、AspNetPager支持各种数据绑定控件GridView、DataGrid、DataList、Repeater以及自定义的数据绑定控件的分页功能十分强大。 三、AspNetPager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关,所以需要手写数据连接方法来配合, 四、结合TOP 。。。NOT IN 的通用存储过程分页方法使用AspNetPager十分实用 测试控件datalist aspnetpager 的分页方法示例 分页方法为 PostBack 方式 1、 首先将AspNetPager.dll复制于应用程序下的bin目录,打开解决方案,引入dll文件 2、 在工具栏中添加控件,这样可以支持拖拽使用 3、 要使用AspNetPager 要为其设置最基本的属性 使用 SqlServer Northwind数据库的 Products表 protected Wuqi.Webdiyer.AspNetPager AspNetPager1; protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.DataList DataList1; private void Page_Load(object sender, System.EventArgs e) { this.AspNetPager1.PageSize=10; //设置每也显示的记录条数 if(!IsPostBack) //只在页面第一次加载时起作用 { SqlDBManager db = new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"]); AspNetPager1.RecordCount=db.CountPage("products");//获得要使用表的记录总数 //db.CountItems自定义的方法 this.BindData(); } } private void BindData() { SqlDBManager db= new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"].ToString(); DataList1.DataSource=db.FenPage(this.AspNetPager1.PageSize,this.AspNetPager1.CurrentPageIndex,"productid","products","productid,productname,unitprice,unitsinstock",""); //自定义方法由 TOP not in 存储过程分页方法改编 this.DataList1.DataBind(); //控件数据绑定 this.Label1.Text="当前第"+this.AspNetPager1.CurrentPageIndex+"页 总"+this.AspNetPager1.PageCount+"页"; } private void AspNetPager1_PageChanged(object sender, System.EventArgs e) { //页索引改变方法 this.BindData(); } 设计页效果 <asp:DataList id="DataList1" style="Z-INDEX: 101; LEFT: 296px; POSITION: absolute; TOP: 96px" runat="server"> <HeaderTemplate> <table border='1'> <tr> <td>产品ID</td> <td>产品名称</td> <td>产品数量</td> <td>产品单价</td> </tr> </HeaderTemplate> <FooterTemplate> </table> </FooterTemplate> <ItemTemplate> <tr> <td><%# DataBinder.Eval(Container.DataItem,"Productid")%></td> <td><%# DataBinder.Eval(Container.DataItem,"productname")%></td> <td><%# DataBinder.Eval(Container.DataItem,"unitprice")%></td> <td><%# DataBinder.Eval(Container.DataItem,"unitsinstock")%></td> </tr> </ItemTemplate> </asp:DataList> <webdiyer:AspNetPager id="AspNetPager1" style="Z-INDEX: 102; LEFT: 256px; POSITION: absolute; TOP: 40px" runat="server" Width="500px" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" Height="40px" NumericButt PagingButt ShowNavigati ShowInputBox="Always" TextAfterInputBox="页" TextBeforeInputBox="跳转到第" AlwaysShow="True"> </webdiyer:AspNetPager> <asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 120px; POSITION: absolute; TOP: 56px" runat="server">Label</asp:Label> 立即下载
public   class  DefaultPagerLayout:ITemplate
{
private  ImageButton Next;
private  ImageButton First;
private  ImageButton Last;
private  ImageButton Previous;
private  Panel Pager;

public  DefaultPagerLayout()
{
Next 
=   new  ImageButton();
First 
=   new  ImageButton();
Last 
=   new  ImageButton();
Previous 
=   new  ImageButton();
Pager 
=   new  Panel();

Next.ID
= " Next " ; Next.AlternateText = " 下一页 " ;Next.ImageUrl = " play2.gif " ;
First.ID
= " First " ; First.AlternateText = " 首页 " ;First.ImageUrl = " play2L_dis.gif " ;
Last.ID 
=   " Last " ; Last.AlternateText  = " 末页 " ;Last.ImageUrl = " play2_dis.gif " ;
Previous.ID
= " Previous " ; Previous.AlternateText = " 上一页 " ;Previous.ImageUrl = " play2L.gif " ;
Pager.ID
= " Pager " ;
}

public   void  InstantiateIn(Control control)
{
control.Controls.Clear();
Table table 
=   new  Table();
table.BorderWidth 
=  Unit.Pixel( 0 );
table.CellSpacing
=   1 ;
table.CellPadding 
= 0 ;
TableRow row 
=   new  TableRow();
row.VerticalAlign 
=  VerticalAlign.Top;
table.Rows.Add(row);
TableCell cell 
=   new  TableCell();
cell.HorizontalAlign 
=  HorizontalAlign.Right;
cell.VerticalAlign 
=  VerticalAlign.Middle;
cell.Controls.Add(First);
cell.Controls.Add(Previous);
row.Cells.Add(cell);
cell 
=   new  TableCell();
cell.HorizontalAlign
=  HorizontalAlign.Center;
cell.Controls.Add(Pager);
row.Cells.Add(cell);
cell 
=   new  TableCell();
cell.VerticalAlign 
=  VerticalAlign.Middle;
cell.Controls.Add(Next);
cell.Controls.Add(Last);
row.Cells.Add(cell);

control.Controls.Add(table);
}

}


  DefaultPagerLayout通过编程的方式提供了所有的导航元素,并将它们加入到aspx页面,不过这一次导航元素用标准的HTML表格设置了格式。现在,如果用户没有提供一个表现模板,程序将自动提供一个默认的模板。


[TemplateContainer(
typeof (LayoutContainer))]
public  ITemplate Layout
{
get { return  (_layout  ==   null ) ?   new  DefaultPagerLayout():_layout;}
set {_layout  = value;}
}



  下面再来看看生成各个页面编号的过程。分页控件首先需要确定一些属性值,通过这些属性值来确定要生成多少不同的页面编号。

public   int  CurrentPage
{
get
{
string  cur  =  ( string )ViewState[ " CurrentPage " ];
return  (cur  ==   string .Empty  ||  cur  == null ) ?   1  :  int .Parse(cur);
}

set
{
ViewState[
" CurrentPage " ]  =  value.ToString();}

}


public   int  PagersToShow
{
get { return  _results;}
set {_results  =  value;}
}


public   int  ResultsToShow
{
get { return  _resultsperpage;}
set {_resultsperpage  =  value;}
}



  CurrentPage保存的实际上是页面编号的ViewState中的当前页面,PagersToShow方法定义的属性允许用户指定要显示多少页面,而ResultsToShow定义的属性则允许用户指定每页要显示多少记录,默认值是10。

  NumberofPagersToGenerate返回当前应当生成的页面编号的数量。

private   int  PagerSequence
{
get
{
return  Convert.ToInt32
(Math.Ceiling((
double )CurrentPage / ( double )PagersToShow));}

}


private   int  NumberOfPagersToGenerate
{
get { return  PagerSequence * PagersToShow;}
}


private   int  TotalPagesToShow
{
get { return  Convert.ToInt32(Math.Ceiling(( double )TotalResults / ( double )_resultsperpage));}
}

public   int  TotalResults
{
get { return  _builder.Adapter.TotalCount;}
}



  TotalPagesToShow方法返回要显示的总页面数量,由用户预设的ResultsToShow属性调整。
  虽然ASP.NET定义了一些默认的样式,不过对于分页控件的用户它们可能不是很实用。用户可以通过自定义样式来调整分页控件的外观。

public  Style UnSelectedPagerStyle  { get   { return  UnselectedPager;} }
public  Style SelectedPagerStyle  { get   { return  SelectedPager;} }



  UnSelectedPagerStyle提供了页面编号未选中时所用的样式,而SelectedPagerStyle提供了页面编号被选中时所用的样式。

private   void  GeneratePagers(WebControl control)
{
control.Controls.Clear();
int  pager  =  (PagerSequence - 1 ) *  PagersToShow  + 1 ;

for  (;pager< = NumberOfPagersToGenerate  &&  pager< = TotalPagesToShow;pager ++ )
{
LinkButton link 
=   new  LinkButton();
link.Text 
=  pager.ToString();
link.ID 
=  pager.ToString();
link.Click 
+=   new  EventHandler( this .Pager_Click);
if  (link.ID.Equals(CurrentPage.ToString()))
link.MergeStyle(SelectedPagerStyle);
else
link.MergeStyle(UnSelectedPagerStyle);

control.Controls.Add(link);
control.Controls.Add(
new  LiteralControl( "   " ));
}

}


private   void  GeneratePagers()
{
GeneratePagers(Holder);
}




   GeneratePagers方法动态地创建所有页面编号,页面编号是LinkButton类型的按钮。各个页面编号的标签和ID属性通过循环赋值,同 时,点击事件被绑定到适当的事件句柄。最后,页面编号被加入到一个容器控件——在本例中是一个Panel对象。按钮ID起到了标识哪一个按钮触发点击事件 的作用。下面是事件句柄的定义:

private   void  Pager_Click( object  sender, System.EventArgs e)
{
LinkButton button 
=  (LinkButton) sender;
CurrentPage 
=   int .Parse(button.ID);
RaiseEvent(PageChanged, 
this , new  PageChangedEventArgs(CurrentPage,PagedEventInvoker.Pager));
Update();
}


private   void  Next_Click( object  sender, System.Web.UI.ImageClickEventArgs e)
{
if  (CurrentPage<TotalPagesToShow)
CurrentPage
++ ;
RaiseEvent(PageChanged, 
this , new  PageChangedEventArgs(CurrentPage,PagedEventInvoker.Next));
Update();
}


private   void  Previous_Click( object  sender, System.Web.UI.ImageClickEventArgs e)
{
if  (CurrentPage >  1 )
CurrentPage
-- ;
RaiseEvent(PageChanged, 
this , new  PageChangedEventArgs(CurrentPage,PagedEventInvoker.Previous));
Update();
}

private   void  First_Click( object  sender, System.Web.UI.ImageClickEventArgs e)
{
CurrentPage 
=   1 ;
RaiseEvent(PageChanged, 
this , new  PageChangedEventArgs(CurrentPage,PagedEventInvoker.First));
Update();
}


private   void  Last_Click( object  sender, System.Web.UI.ImageClickEventArgs e)
{
CurrentPage 
=  TotalPagesToShow;
RaiseEvent(PageChanged, 
this , new  PageChangedEventArgs(CurrentPage,PagedEventInvoker.Last));
Update();
}



  这些事件句柄都相似,它们首先更改分页控件的当前页面,然后刷新绑定的控件。

private   void  Update()
{
if  ( ! HasParentControlCalledDataBinding)  return ;
ApplyDataSensitivityRules();
BindParent();
BoundControl.DataBind();
}



   首先,分页控件通过调用HasParentControlCalledDataBinding方法检查是否已经初始化了必要的适配器。如果是,则将前面 指出的根据数据显示情况自动调整控件的规则应用到当前的控件,这些规则使得分页控件根据BoundControl中数据的不同情况表现出不同的行为。虽然 这些规则由分页控件内部控制,但必要时可以用[GoF] State模式方便地移出到控件之外。

public   bool  IsDataSensitive
{
get { return  _isdatasensitive;}
set {_isdatasensitive  =  value;}
}


private   bool  IsPagerVisible
{
get { return  (TotalPagesToShow  !=   1 )  &&  IsDataSensitive;}
}


private   bool  IsPreviousVisible
{
get
{
return  ( ! IsDataSensitive) ?   true :
(CurrentPage 
!=   1 );
}

}


private   bool  IsNextVisible
{
get
{
return  ( ! IsDataSensitive) ?   true :
(CurrentPage 
!=  TotalPagesToShow);
}

}


private   void  ApplyDataSensitivityRules()
{
FirstButton.Visible 
=  IsPreviousVisible;
PreviousButton.Visible 
=  IsPreviousVisible;
LastButton.Visible 
=  IsNextVisible;
NextButton.Visible 
=  IsNextVisible;
if  (IsPagerVisible) GeneratePagers();
}



   ApplyDataSensitivityRules方法实施预定义的规则,诸如IsPagerVisible、IsPreviousVisible和 IsNextVisible。默认情况下,分页控件将启用这些规则,但用户可以通过设置IsDataSensitive属性来关闭这些规则。

  至此为止,分页控件的显示部分基本设计完毕。最后剩下的结束工作是提供几个事件句柄,使得用户能够在各种分页控件事件出现时进行必要的调整。

public   delegate   void  PageDelegate( object  sender,PageChangedEventArgs e);

public   enum  PagedEventInvoker {Next,Previous,First,Last,Pager}

public   class  PageChangedEventArgs:EventArgs
{
private   int  newpage;
private  Enum invoker;

public  PageChangedEventArgs( int  newpage): base ()
{
this .newpage  =  newpage;
}

public  PageChangedEventArgs( int  newpage,PagedEventInvoker invoker)
{
this .newpage  =  newpage;
this .invoker  =  invoker;
}

public   int  NewPage  { get { return  newpage;} }
public  Enum EventInvoker { get { return  invoker;} }
}



   由于分页控件需要返回自定义的事件参数,所以我们定义了一个专用的PageChangedEventArgs类。 PageChangedEventArgs类返回PagedEventInvoker类型,PagedEventInvoker类型是可能触发事件的控件 的枚举量。为了处理自定义的事件参数,我们定义了一个新的delegate,即PageDelegate。事件按照下面的形式定义:

public   event  PageDelegate PageChanged;
public   event  EventHandler DataUpdate;



  当事件没有对应的事件监听器时,ASP.NET会抛出一个异常。分页控件定义了下列RaiseEvent方法。

private   void  RaiseEvent(EventHandler e, object  sender)
{
this .RaiseEvent(e, this , null );
}


private   void  RaiseEvent(EventHandler e, object  sender, PageChangedEventArgs args)
{
if (e != null )
{
e(sender,args);
}

}

private   void  RaiseEvent(PageDelegate e, object  sender)
{
this .RaiseEvent(e, this , null );
}


private   void  RaiseEvent(PageDelegate e, object  sender, PageChangedEventArgs args)
{
if (e != null )
{
e(sender,args);
}

}



  现在事件句柄可以通过调用各个RaiseEvent方法来触发事件了。

  四、应用实例

  至此为止,分页控件的设计已经全部完成,可以正式使用了。要使用该分页控件,只要把它绑定到一个表现控件即可。


<asp:Repeater ID="repeater" Runat="server">
<ItemTemplate>
列1:
<%# Convert.ToString(DataBinder.Eval(Container.DataItem,"Column1"))%>
<br>
列2:
<%# Convert.ToString(DataBinder.Eval(Container.DataItem,"Column2"))%>
<br>
列3:
<%# Convert.ToString(DataBinder.Eval(Container.DataItem,"Column3"))%>
<br>
<hr>
</ItemTemplate>
</asp:Repeater>
<cc1:Pager id="pager" ResultsToShow="2" runat="server" BindToControl="repeater">
<SELECTEDPAGERSTYLE BackColor="Yellow" />
</cc1:Pager>



  上面的aspx页面将分页控件绑定到一个Repeater控件,设置每页显示的记录数量为2,选中的页面编号颜色为黄色,使用默认的布局,效果如图一。下面是另一个例子,它将分页控件绑定到一个DataGrid,效果如图二。


<
asp:DataGrid ID = " Grid "  Runat = " server " ></ asp:DataGrid >
< cc1:Pager id = " PagerGrid "  ResultsToShow = " 2 "  runat = " server "  BindToControl = " Grid " >
< SELECTEDPAGERSTYLE BackColor = " Red " ></ SELECTEDPAGERSTYLE >
< LAYOUT >
< asp:ImageButton id = " First "  Runat = " server "  imageUrl = " play2L_dis.gif "  AlternateText = " 首页 " ></ asp:ImageButton >
< asp:ImageButton id = " Previous "  Runat = " server "  imageUrl = " play2L.gif "  AlternateText = " 上一页 " ></ asp:ImageButton >
< asp:ImageButton id = " Next "  Runat = " server "  imageUrl = " play2.gif "  AlternateText = " 下一页 " ></ asp:ImageButton >
< asp:ImageButton id = " Last "  Runat = " server "  imageUrl = " play2_dis.gif "  AlternateText = " 末页 " ></ asp:ImageButton >
< asp:Panel id = " Pager "  Runat = " server " ></ asp:Panel >
</ LAYOUT >
</ cc1:Pager >



  测试表明,分页控件并不依赖于特定的表现控件,它可以方便地处理不同的数据源,而且很容易使用,请读者下载本文后面的源代码参见完整的例子。

   虽然学习开发自定义Web控件不是一件轻松的事情,但掌握这项技能带来的好处不言而喻,只要稍微增加一些工作量,开发者就可以将普通的Web控件改换成 多用途的通用控件,数十倍地提高工作效率,本文的分页控件只是创建通用控件来满足现有和将来表现需要的其中一个例子而已。

应用实例:

邀月工作室

 

 

下载地址二:

http://download.youkuaiyun.com/source/334554

下载地址一:

http://files.cnblogs.com/downmoon/testGrid.rar


 

助人等于自助!   3w@live.cn

C#自定义分页插件 C#后台拼接分页字符串,适用于无刷新分页。拼接的Html代码根据自己项目的需要,可以自己改动! 立即下载

相关推荐

C#超级好用的分页控件

C# 超级好用 分页控件,兼容到IE9,超级好用,现在的项目就在用这个分页

C# 分页控件

先看实现项目的效果图: 特别是由于数据量比较大,页面显示卡顿需要分页显示时,这种控件就显得特别需要了。 之前看到不少控件库都有提供这个控件,但是单独提取出来的话,需要附带很多它类库里面的依赖文件,而且代码巨多,修改起来也特么难搞。 后来找了很久,才发现一个不错的。于是下载了,自己修改下,去除了数据绑定和重复的按钮,修改了一下样式和代码,直接生成了控件库项目。 使用起来也非常方便,直接在 VS的解决方案中加载 库项目 ,跟项目中的winform在同一个解决方案中,然后在打开一个winform界面,右边工具

XINGTECODE的博客 3474

开关电源三大基本拓扑:反激、正激与桥式选型本质

开关电源拓扑是电力电子系统设计的核心基础概念,其本质决定能量传递路径、器件应力分布与系统物理边界。反激拓扑以耦合电感形式实现隔离与升降压,适用于小功率AC-DC场景;正激拓扑依赖实时能量传递与强制复位机制,支撑中功率高效率需求;桥式拓扑(含推挽/半桥/全桥)通过电压应力分摊与双向磁化,成为大功率系统的刚性选择。理解三者在磁芯工作模式、电流连续性、直流偏磁抑制等方面的原理差异,直接关系到效率、温升、EMI及可靠性等关键技术指标。本文聚焦反激、正激、桥式三大工程级基本拓扑的物理本质与落地约束,揭示从需求参数到电

cqwmy840702的博客 374

winform 分页控件,源码下载

http://files.cnblogs.com/nosnowwolf/Pager.rar控件下载 以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。 想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的。 首先创建一个用户控件名称为pager...

weixin_30361753的博客 287

ACT代码梳理:新手学具身智能,不需要学会一堆理论,先跑起来再说

我是一个刚接触具身智能的小白。第一次看 ACT 项目,什么 Transformer、VAE、Mujoco、rollout,全是天书。但我没打算先把理论补完。太难,也太慢。我的策略是:直接上手,边做边学,卡在哪就学到哪。这篇文章是我的第一站——带你一起看懂 ACT 项目的整体架构,了解它的核心模块和流程。开始前,我列了 本文出现的18 个关键词,是我一开始完全搞不懂的。你可以先扫一眼,如果不认识的超过 10 个,那我们就是同路人,可以放心往下看了。

qq_17405041的博客 1207

学习记录-Simpack生成车轮不圆的几种示例

单阶、多阶和实测车轮多边形的添加教程

weixin_51965897的博客 3703

C# WinForm自定义通用分页控件

Winform 自定义控件--通用分页控件 C/S通用 .Net FrameWork

bsx133的博客 2649

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦

本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。

weixin_29079671的博客 250

C# 通用分页用户控件

C# 通用分页用户控件

u012887668的博客 3244

避坑指南:PyTorch ConvLSTM参数配置的那些坑(hidden_dim/kernel_size/num_layers详解)

本文深度解析PyTorch ConvLSTM中hidden_dim、kernel_size和num_layers三大核心参数的配置技巧,提供实战指南和性能优化建议。通过实验数据揭示参数组合的内在规律,帮助开发者避免常见配置陷阱,提升时空序列建模效果。特别针对视频预测、气象预报等应用场景,给出黄金参数组合方案和调试技巧。

vv45678的博客 700

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。 注意事项: 1.编译报错:error C2065: “libvlc_media_read_cb”: 未声明的标识符。修改如下: 2.libvlc_new(0, nullptr)返回null 将plugins

草上爬的博客 5048

4.c#自定义控件之分页器PaginationControl

当前页面变化时候触发paginationControl1_CurrentPageChanged。每页数量发送变化是触发paginationControl1_PageSizeChanged。PageSizes --下拉框哪里,可以更改每页数据条数类型如10条每页,20条每页。PageSize --每页数据条数。PagerCount —按键数量。Total 总数据数量。

adsd1233123的博客 769

瑞数jsvmp算法还原流程讲解

​ 又是很久没写文章了,今天水一篇文章吧,鉴于之前有看到过别人的文章被警告的案例,所以这篇文章就仅写一下还原瑞数vmp的大概流程吧(仅记录下自己还原的思路)

博客 6606

一个相当独立的.通用分页控件c#源码一(downmoon收集)

关键词: downmoon,c#,分页 (文后附源码) 通用ASP.NET数据分页控件 对于几乎所有的数据表现Web应用来说,组织好数据的显示方式、避免给用户带来混乱的感觉就是最主 要的目标之一。每个页面显示20条记录当然是可以接受的,但每页显示10000条记录就很容易给用户带来不便了。将数据分成多个页面显示,即对数据进行...

dfdfadsf3443的博客 128

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

宁波阿成的博客 524

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

一个相当独立的.通用分页控件c#源码三(downmoon收集)

DataView类型和DataTable类型的关系是如此密切,所以构造一个通用性的DataAdapter可能是有意义的,其实只要加入另一个处 理DataTable的构造函数就足够了。遗憾的是,当用户需要不同的功能来处理某个DataTable时,就必须替换或继承整个类。如果我们构造一个使 用同一IdataSourceAdapter的新Builder,用户在选择如何实现适配器时就拥有更多...

dfdfadsf3443的博客 121

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

一个相当独立的.通用分页控件c#源码二(downmoon收集)

二、核心功能   当表现控件触发DataBinding事件,分页控件就可以获取DataSource属性。遗憾的是,微软没有提供所 有数据绑定类实现的接口,诸如IdataSourceProvider之类,而且并非所有从Control或WebControl类继承的控件都有一个 DataSource属性,因此向上定型成Control类没有意义,唯一可行的办法是通过Reflection API直接

邀月周记 2950

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 一个相当独立的.通用分页控件c#源码三(downmoon收集)
下一篇: 存储过程中的top+变量(downmoon)sql
downmoon
博客等级 码龄24年 1676粉丝 494原创
评论 27
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值