做一个可编辑的表格控件

原创 2004年05月12日 18:31:00

【实现内容】做一个可编辑的表格控件。

【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。

【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身是不支持直接编辑的。所以需要结合文本控件或者下拉列表控件,使表格控件的运行效果如同可以直接编辑一样。

【实现步骤】

1.  当鼠标点击表格控件的某一格时,首先判断该列的属性,是直接编辑呢,还是用下拉列表进行选择。

2.  显示隐藏的文本控件或者下拉列表控件,显示的位置和大小与选中格的位置大小完全相同,这样可以覆盖选中格

3.  将选中格的内容填到文本控件或者下拉列表控件中

4.  修改完毕后,将新的内容填到选中格中,同时隐藏文本控件或者下拉列表控件。

【主要程序段及说明】

变量定义:

CComboBox m_ChangeCombo--下拉列表控件,初始时不可见

CEdit       m_Change---------------文本控件,初始时不可见

CSring  m_sChange;----------------与文本控件关联的字符串

CMSFlexGrid  m_FlexGrid-----表格控件

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

程序段:

表格点击事件:选中某一格后,就要显示相应的文本控件或者列表控件

void CChartInfoEditDlg::OnClickMsflexgrid()

{

       //点击无效区,返回

       long lRow = m_FlexGrid.GetRowSel();//获取点击的行号

       long lCol = m_FlexGrid.GetColSel();  //获取点击的列号

       if(lRow>m_SAttrInfo.attrNum)      //如果点击区超过最大行号,则点击是无效的

              return;

       if(lRow == 0)                    //如果点击标题行,也无效

              return;

       //

       CRect rect;

       m_FlexGrid.GetWindowRect(rect);  //获取表格控件的窗口矩形

       ScreenToClient(rect);             //转换为客户区矩形

       // MSFlexGrid 控件的函数的长度单位是"(twips)"

       //需要将其转化为像素,1440 = 1 英寸

       CDC* pDC =GetDC();

    //计算象素点和缇的转换比例

       int nTwipsPerDotX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX) ;

       int nTwipsPerDotY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY) ;

       //计算选中格的左上角的坐标(象素为单位)

       long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;

       long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX;

    //计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好

       long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;

       long height = m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1;

    //形成选中个所在的矩形区域

       CRect rc(x,y,x+width,y+height);

    //转换成相对对话框的坐标

       rc.OffsetRect(rect.left+1,rect.top+1);

       //清空下拉列表的内容

       m_ChangeCombo.ResetContent( );

    //以下省略哪一列用文本控件,哪一列用下拉列表控件的判断。如果是用下拉列表控件,则会先向下拉列表控件中增加数据,否则为空

……………………………….

……………………………….

       //获取选中格的文本信息

       CString strValue = m_FlexGrid.GetTextMatrix(lRow,lCol);

       int num = m_ChangeCombo.GetCount();

    //如果下拉列表控件中有数据,则表示使用下拉列表控件来进行数据选择

       if(num!=0)

       {

              m_ChangeCombo.ShowWindow(SW_SHOW);//显示控件

              m_ChangeCombo.MoveWindow(rc);        //移动到选中格的位置,覆盖

              m_ChangeCombo.SelectString(-1,strValue);   //内容全选。方便直接修改

              m_ChangeCombo.SetFocus();              //获取焦点

              UpdateData(false);

              return;

       }

       //

       m_Change.ShowWindow(SW_SHOW);    //显示控件

       m_Change.SetWindowText(strValue);      //显示文本

       m_Change.SetFocus();                  //获取焦点

       m_Change.SetSel(0,-1);                 //全选

       m_Change.MoveWindow(rc);            //移动到选中格的位置,覆盖

}

文本编辑完毕后,回车即将新的文本信息填到选中格中

void CChartInfoEditDlg::OnKillfocusEditChange()

{

       UpdateData(true);

       m_FlexGrid.SetText(m_SChange);//设置文本信息

       m_Change.ShowWindow(SW_HIDE);      //隐藏文本控件

       UpdateData(false);

}

下拉列表编辑完毕后,将新的新息填到选中格中

void CChartInfoEditDlg::OnKillfocusChangecombo()

{

       UpdateData(true);

       CString str;

       m_ChangeCombo.GetWindowText(str);

m_FlexGrid.SetText(str);

       m_ChangeCombo.ShowWindow(SW_HIDE);

       UpdateData(false);

}

【总结】这是一个比较简单的程序。如果表格中列较多,属性各有不同,也许大家可以试着用更加复杂的控件来编辑信息。也可以同时做多个文本控件和下拉列表控件,以对应不同列的不同信息要求(比如有的格信息可能又不同的格式要求,那么可以预先做好各种不同风格的控件与之对应)。

【笔者注】虽然当前有许多这样的例子。但笔者做这个程序时,并没有借鉴现有的东西。因此可能在方法上不见得最简单。但确实效果不错,对付一般情况是没有问题的。大家如果对此有疑问或新思想,可以和笔者讨论。联系信箱:happyparrot@126.com

制作VC表格控件-综合类编程-VC

我们在利用Visual C++开发基于数据库的软件时,经常要使用大量的表格,而Visual C++中并没有提供相应的表格 控件,因此需要我们程序员自己制作,本文将介绍一个简单的表格控件的制作全过程。 ...
  • truement
  • truement
  • 2006年06月25日 20:42
  • 2383

自定义表格控件

  • 2014年09月23日 13:48
  • 729KB
  • 下载

C++实现可编辑列表框控件类

正常情况下,我们的ListCtrl是不可编辑的。那么我们怎么来实现一个可编辑的ListCtrl类呢? 思路如下: 1、类成员CEdit变量 2、当在列表框上双击一项时,获取点击坐标所对应的行和列,分别...
  • haolipengzhanshen
  • haolipengzhanshen
  • 2014年02月12日 08:45
  • 2438

vc6写的表格控件源码,非常完整,可以直接编译

  • 2009年09月18日 21:32
  • 806KB
  • 下载

javascript简单表格编辑功能插件

  • 2016年07月29日 13:59
  • 5KB
  • 下载

做一个可编辑的表格控件

【实现内容】做一个可编辑的表格控件。【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身是不支持直接...
  • happyparrot
  • happyparrot
  • 2004年05月12日 18:31
  • 3338

自己做jQuery开源插件之终极篇:数据表格插件

在所有jQuery插件中,我觉得功能复杂度最高的
  • u014227966
  • u014227966
  • 2014年04月11日 17:17
  • 893

做一个可编辑的表格控件

【实现内容】做一个可编辑的表格控件。【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身是不支持...
  • hejishan
  • hejishan
  • 2008年03月11日 10:52
  • 153

用VC++设计一个可编辑的表格控件

【实现内容】做一个可编辑的表格控件。  【使用控件】一个MSFLEXGRID表格控件,一个文本控件,一个下拉列表控件。  【实现原理】我喜欢把这个方法称为视觉假象。由于MSFLEXGRID控件本身是不...
  • qsdnet
  • qsdnet
  • 2005年09月16日 23:04
  • 1368

自己做个js表格插件呗--mytable v0.1

mytable 0.1在开发中试用了很多表格插件,发现太复杂了,而我只想要通过后台传来的json数据使用js生成表格而已。 为什么是0.1版本开始,因为她就只有0.1的功能啊。...
  • fengzi1995
  • fengzi1995
  • 2017年11月30日 11:04
  • 84
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:做一个可编辑的表格控件
举报原因:
原因补充:

(最多只允许输入30个字)