分享
 
 
 

VC操作SQLServer主从表

王朝mssql·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一、窗口如何分割

切分窗口既适用于SDI应用程序,也适宜于MDI应用程序。它通常驻是以类 CSplitterWnd来表示,对 Windows 来说,CSplitterWnd 是一个真正的窗口,它完全占用框架窗口的客户区域而视图占用切分窗口的窗格区域。 动态切分与静态切分 动态切分允许用户须任何时候对窗口进行切分,用户既可以通过选取菜单也可以通过拖动滚动条中的切分框来进行切分。动态切分窗口使用的是一个视图类。 静态切分,当窗口第一次被创建时,窗格就已经被切他好了,它们不能再被改变。用户可以移动窗格边框,但此时不能再对窗口进行合并或再划分。静态切分窗口允许使用多个视图类,并且可以创建时对这些视图类进行配置。在静态切分窗口中,每个窗格都有自己的滚动条。 动态切分比较简单,不实用,下面看静态切分。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

CRect rect;

GetClientRect(&rect);

m_wndSplitter1.CreateStatic(this,1,2);

m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CClassTreeView),CSize(150,150),pContext);

m_wndSplitter2.CreateStatic(&m_wndSplitter1,

2,1,WS_CHILD|WS_VISIBLE,

m_wndSplitter1.IdFromRowCol(0,1));

m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CDagDetialView),CSize(0,0),pContext);

m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CDagView),CSize(0,0),pContext);

m_wndSplitter2.SetRowInfo(0,rect.Height()/2,0);

return true;

//重载时不能调用基类的OnCreateClient()

}

以上是本程序DEMO使用的方法。关于切分详细信息,请查阅MSDN.

二、多视图之间的通信

本程序demo使用了三个视图类,Winzard生成了一个,其余的是我加的。关于多视图之间的通信主要是茯得你要访问的视图类的pointer,如何茯得?有两种方法1,通过视图类(如果有多个视图共享一个文档类的话)2.通过主框架茯得。由于我的程式就一个文档类,其他视图类是独立的,所以就采用第二种方法了。

以下代码是茯得CDagDetialView类指针的示例,其余类同。CMainFrame* pFrame=static_cast<CMainFrame*(AfxGetMainWnd());//茯得主框架

CDagDetialView* pDagDetialView =

static_cast<CDagDetialView*(pFrame-m_wndSplitter2.GetPane(1,0));

以上有一点,我觉得最好采用以上形式,虽说通过C的强制转换语法也行,但最好还是使用C++的语法比较好。

茯得视图指针后你就可以do anything that you want to do

顺便说一下,通信细节有一些牵连到效率的地方,一定要妥善处理。上面的demo程式,没有考虑过多。因为我觉得这比较适合大家看明白意思,如果程式模块分散开来,程式看起来是简洁了不少,但不太方便看清程序流程。请见谅。

三、列表视图的操作及事件处理

说句实话,列表的属性参数很多,标准的、扩展的风格参数一大堆,看看那些英文文档,在其中苦苦搜寻,找一条自己需要的特性,其中的滋味别提了。还好我很有耐心:)熟练了就好了,都记住了一大半,还怕什么。列表控件显示数据,要用LVS_REPORT风格,比较好看,就像DataGrid一样。设置窗口风格需要用SetWindowLong这个API函数。这个函数是通用的。参数也一大堆。处理列表的单击事件即是处理消息NM_CLICK,处理选择改变时的事件即是处理LVN_ITEMCHANGED,不同的消息可能参数不同,需区别对待。

void CDagView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

// TODO: Add your control notification handler code here

CListCtrl& refListCtrl=GetListCtrl();

if(pNMListView-uNewState&LVIS_SELECTED)

…//选取列表项时,事件触发

pResult=0;

}

同样的方法处理单击,双击等事件,不再嗷述。

四、树形控件的操作及事件处理,利用递归根据数据库动态生成目录

树形控件,和列表控件一样,在VC数据开发中有着非常重要的地位。常用来显示分级,分类信息。其实,提到树,脑海里就出现一大堆树,什么二叉树,查找树,哈夫曼树等一大堆,也就想起了遍历树的常用算法―递归。虽然采用堆栈更有效率,但使用递归常使程序设计简化。

看以下程式片段: pRS-MoveFirst();

_variant_t var;

CString strTableName,strTableCode;

HTREEITEM hChildItem;

while(!pRS-adoEOF)

{

var=pRS-GetCollect("menucode");

if(var.vt != VT_NULL)

strTableCode = (LPCSTR)_bstr_t(var);

//此即函数递归出口

if(!strTableCode.Find(strParent,0) &&

strTableCode.GetLength()==strParent.GetLength()+2)

{

hChildItem=refTree.InsertItem(strTableName,hTreeNode,TVI_LAST);

InitTree(refTree,hChildItem,strTableCode);

}

pRS-MoveNext();

}

递归时充分利用树形结构的特点。然后结合递归思想,融合在一起,就行了。这里就是理论和实际的结合点。不同的开发语言提供的操作接口是不同的,如Delphi、.dotnet。我呈在在.net也实现了一个类似的树,算法思想一样,只是具体操作不同,因为dotnet提供的接口不同。

树形控件的事件处理: void CClassTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

// TODO: Add your control notification handler code here

CTreeCtrl& refTreeCtrl=GetTreeCtrl();

HTREEITEM hSelected=pNMTreeView-itemNew.hItem;

if(hSelected!=NULL)

{

m_strMenuName=refTreeCtrl.GetItemText(hSelected);

if(AfxGetMainWnd()-IsWindowEnabled())

UpdateDagView();

}

//-----------

*pResult = 0;

}

五、实现主从表的显示

由于我假设不知道数据库中有多少字段,字段名都是不知道的。所有都动态生成。所以首先要检索主键。把主键检索出来以后,然后得到列表当前选择行的对应于主键列的数据。然后以这些主键列的值当作检索条件检索从表的数据(从表的主键一定多于主表)最后将结果显示出来。看起来过程也挺简单的,如果用dotnet中DataGrid做的话,太简单了是吧,但VC操作起来,就有点麻烦了。就拿从列表取当前选择行的主键列的数据的话,和dotnet一比,就知道VC麻烦在哪儿了。(不过我还是比较喜欢VC,嘿嘿)。一个DataGrid,如果我知道了列名,又茯取了当前行的行号(CurrentRowIndex)

如果你后台是直接绑定的一个DataTable,就可以直接取得这个值:myTable.Rows[CurrnetRowIndex][“pkey1”].ToString();

当然如果你后面不是直接绑定一个DataTable,而是一个结果经过虑后的结果,那么可能会稍烦琐一点。这里不对这种情况进行计讨论。下面看一下VC下是怎么处里的,(如果有更好的方法,请通知我,先谢了) int CDagView::GetColumnIndex(CListCtrl &ref,LPCTSTR strCol)

{

CHeaderCtrl * pHeader=ref.GetHeaderCtrl();

int nCount=pHeader-GetItemCount();

TCHAR

lpBuffer[256];

bool

fFound = false;

HDITEM hdi;

hdi.mask = HDI_TEXT;

hdi.pszText = lpBuffer;

hdi.cchTextMax = 256;

int index=-1;

for (int i=0;!fFound && (i < nCount);i++)

{

pHeader-GetItem(i, &hdi);

if (strcmp(hdi.pszText, strCol) == 0)

{

index=i;

fFound = true;

}

}

return index;

}

iSubItem=GetColumnIndex(refListCtrl);

CString strValue=refListCtrl.GetItemText(iCurrent,iSubItem);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有