详解在数据查看界面中增加记录导航功能,你应该需要的

简介:

一般我们在做数据内容展示的时候,只需把该对象的详细信息,分门别类放到一个窗体展示即可,在我的Winform开发框架中,一般也侧重于使用这种传统的方式,只是通过窗体继承方式,把通用的窗体操作封装到基类实现而已。如一般的数据展示窗体,包括查看数据,编辑数据、新建数据等内容的窗体,如下所示。

对于以上窗体,如果仅仅是看当前记录的数据,是没什么问题的,但如果要看下一个记录的、上一个记录的数据,就要关闭该窗体,然后重新打开,操作起来会稍微麻烦一些。如果我们在这个窗体上设计一个导航栏,那么界面会显得友好一些,界面效果如下所示。

这样就可以随意在各个记录之间浏览数据了,原来的保存或或其它操作,并没有影响,两全其美,何乐不为呢?

其实这样的操作,已经是比较通用的界面元素部分,因此可以把它封装到基类中即可,我们在之类只需要传入必要的数据给他即可,首先我们设计一个导航控件,如下所示。

然后再编辑窗体基类中嵌入对应的控件即可,由于需要在窗体子类中调整导航控件的位置,因此把它的属性设置为Protected即可,如下图所示。

这个窗体里面集成了DataNavigator用户控件,该控件除了响应如分页的导航按钮事件外,就是响应和显示对应的记录位置而已,因此在其中编写相关的处理代码即可,如下所示。

namespace  ParkDeviceUserMis.UI.BaseUI
{
    
public   delegate   void  PostionChangedEventHandler( object  sender, EventArgs e);

    
public   partial   class  DataNavigator : DevExpress.XtraEditors.XtraUserControl
    {
        
public   event  PostionChangedEventHandler PositionChanged;
        
private   int  m_CurrentIndex  =   0 ; // 当前的位置
         public  List < string >  IDList  =   new  List < string > ();

        
///   <summary>
        
///  获取或设置索引值
        
///   </summary>
         public   int  CurrentIndex
        {
            
get  {  return  m_CurrentIndex; }
            
set  
            {
                m_CurrentIndex 
=  value;
                ChangePosition(value);
            }
        }
        
public  DataNavigator()
        {
            InitializeComponent();            
        }

        
private   void  btnFirst_Click( object  sender, EventArgs e)
        {
            ChangePosition(
0 );
        }

        
private   void  btnPrevious_Click( object  sender, EventArgs e)
        {
            ChangePosition(m_CurrentIndex 
-   1 );
        }

        
private   void  btnNext_Click( object  sender, EventArgs e)
        {
            ChangePosition(m_CurrentIndex 
+   1 );
        }

        
private   void  btnLast_Click( object  sender, EventArgs e)
        {
            ChangePosition(IDList.Count 
-   1 );
        }

        
private   void  EnableControl( bool  enable)
        {
            
this .btnFirst.Enabled  =  enable;
            
this .btnLast.Enabled  =  enable;
            
this .btnNext.Enabled  =  enable;
            
this .btnPrevious.Enabled  =  enable;
        }

        
private   void  ChangePosition( int  newPos)
        {
            
int  count  =  IDList.Count;
            
if  (count  ==   0 )
            {
                EnableControl(
false );
                
this .txtInfo.Text  =   "" ;
            }
            
else
            {
                EnableControl(
true );

                newPos 
=  (newPos  <   0 ?   0  : newPos;
                m_CurrentIndex 
=  ((count  -   1 >  newPos)  ?  newPos : (count  -   1 );
                
this .btnPrevious.Enabled  =  (m_CurrentIndex  >   0 );
                
this .btnNext.Enabled  =  m_CurrentIndex  <  (count  -   1 );
                
this .txtInfo.Text  =   string .Format( " {0}/{1} " , m_CurrentIndex  +   1 , count);

                
if  (PositionChanged  !=   null )
                {
                    PositionChanged(
this new  EventArgs());
                }
            }
        }

        
private   void  DataNavigator_Load( object  sender, EventArgs e)
        {
        }
    }

而编辑窗体的基类也需要对控件的事件进行相应的处理,如下所示。我们看到,这个基类需要子类窗体传入一个当前显示的ID(或其它唯一标示)和ID集合,作为数据导航之用,并且对导航控件位置变化的事件进行处理,传入给其新的ID(或其它唯一标示),然后窗体根据这个ID显示相应的数据。

     public   partial   class  BaseEditForm : BaseForm
    {
        
public   string  ID  =   string .Empty;   //  主键主键
         public  List < string >  IDList  =   new  List < string > (); // 所有待展示的ID列表

        
public  BaseEditForm()
        {
            InitializeComponent();

            
this .dataNavigator1.PositionChanged  +=   new  ParkDeviceUserMis.UI.BaseUI.PostionChangedEventHandler(dataNavigator1_PositionChanged);
        }

        
private   void  dataNavigator1_PositionChanged( object  sender, EventArgs e)
        {
            
this .ID  =  IDList[ this .dataNavigator1.CurrentIndex];
            DisplayData();
        }

最后在使用的时候,一般在查询界面中,需要弹出编辑窗体的事件响应操作中,传入当前显示的ID和总的ID字段集合即可,如下实现代码。

         private   void  winGridViewPager1_OnEditSelected( object  sender, EventArgs e)
        {
            
string  ID  =   this .winGridViewPager1.gridView1.GetFocusedRowCellDisplayText( " Id " );            
            List
< string >  IDList  =   new  List < string > ();
            
for  ( int  i  =   0 ; i  <   this .winGridViewPager1.gridView1.RowCount; i ++  )
            {
                
string  strTemp  =   this .winGridViewPager1.GridView1.GetRowCellDisplayText(i,  " Id " );
                IDList.Add(strTemp);
            }

            FrmEditPark dlg 
=   new  FrmEditPark();
            dlg.ID 
=  ID;
            dlg.IDList 
=  IDList;
            
if  (DialogResult.OK  ==  dlg.ShowDialog())
            {
                BindData();
            }
        }

这样我们就看到开始介绍的窗体效果,如下所示。

本文转自博客园伍华聪的博客,原文链接:详解在数据查看界面中增加记录导航功能,你应该需要的,如需转载请自行联系原博主。



目录
相关文章
|
小程序
小程序常见简单界面功能属性记录
小程序常见简单界面功能属性记录
158 0
|
数据库
Layui入门&动态树&动态选项卡&用户增加&修改&删除&(一)
Layui入门&动态树&动态选项卡&用户增加&修改&删除&
|
3月前
|
数据可视化 前端开发 JavaScript
可视化图表与源代码显示配置项及页面的动态调整功能分析
本篇文章对可视化图表与源代码显示配置项及页面的动态调整进行了一个详细的功能分析,我将文章内容分为四个部分(分析图表源代码;分析源代码显示功能;分析源代码显示及动态调整;分析代码编辑器及运行效果显示)。对此,我会一一为大家解释代码的结构,功能的组成;且文章出现的所有代码,为了方便小白也能够读懂,我都做了详细的注释
52 0
可视化图表与源代码显示配置项及页面的动态调整功能分析
|
6月前
|
JavaScript
vue列表信息展示中新增数据,与编辑数据页面复用,降低重复代码
vue列表信息展示中新增数据,与编辑数据页面复用,降低重复代码
270 2
|
6月前
|
移动开发 前端开发 JavaScript
动态获取新增的数据+项目实例介绍
动态获取新增的数据+项目实例介绍
90 0
Layui入门&动态树&动态选项卡&用户增加&修改&删除&(二)
Layui入门&动态树&动态选项卡&用户增加&修改&删除&
|
SQL Java 关系型数据库
从系统报表页面导出20w条数据到本地只用了4秒,我是如何做到的
最近有个学弟找到我,跟我描述了以下场景: 他们公司内部管理系统上有很多报表,报表数据都有分页显示,浏览的时候速度还可以。但是每个报表在导出时间窗口稍微大一点的数据时,就异常缓慢,有时候多人一起导出时还会出现堆溢出。 他知道是因为数据全部加载到jvm内存导致的堆溢出。所以只能对时间窗口做了限制。以避免因导出过数据过大而引起的堆溢出。最终拍脑袋定下个限制为:导出的数据时间窗口不能超过1个月。
|
JavaScript
fastadmin 自定义 按钮 动态切换数据 TAB切换
fastadmin 自定义 按钮 动态切换数据 TAB切换
278 0
|
资源调度 前端开发
让后台查询+表格这种页面更加快速和简便
让后台查询+表格这种页面更加快速和简便
153 0
|
存储 开发框架 前端开发
ModStartCMS v5.5.0 页面标签支持,用户逻辑优化
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。