VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: yefeng619

在VC.NET中DataGrid控件的列宽设置!!

[复制链接]

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-6 22:15:01 | 显示全部楼层
我以前也遇到过这个问题,首先你在VS中添加CColumn和Ccolumns类方法应该使用的下面的方法:(就是这种添加方法导致了你的这种问题)
解决方案,方案名->右击->添加类->ActiveX控件中的MFC类->添加弹出了“从ActiveX控件添加类向导,然后选择”文件“->位置处填写你所添加的控件的.Ocx文件(C:\WINDOWS\system32\MSDATGRD.OCX),在这里我只是添加了CColumn 和CColumns 两个类。
注意:用这种方法添加的Ccolumn和Ccolumns类,不仅函数名会改变,而且在运用的时候会出现各种问题,连最基本的Ccolumns cols=m_grid.GetItem(ColeVariant(long(0)));编译都不能通过,更是由于很多函数名的更改,造成很多困难。
我经过研究以后,使用下面的方法就可以成功使用CColumn和Ccolumns类中的所有函数,而且不会产生错误

我们可以先在VC++中添加Microsoft DataGrid Control Version(OLEDB)控件,IDE会自动给我们添加所需要的函数,将添加后的Ccolumn和Ccolumns的头文件和源文件,复制到我们VS工程目录下,将它们添加到工程中,就可以正常使用了,而且编译也不会出任何问题!

我相信上面的解答可以解决你的问题了。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-6 22:30:01 | 显示全部楼层
哈哈,你的第二个问题,刚好我也解决了,下面是解决方法:

我用的数据库是ACCESS,查了好多资料才知道ACCESS用的是JET SQL,而SQL SERVER 用的是T-SQL,有很大差别,JET SQL是相当烂的,很多不支持,本来想用declare来声明游标来解决,谁知道ACCESS根本不识别

最后没办法,只能选用了,生成临时表的方法,而JET SQL不支持生成临时表,所以只能生成表了,后面再删除是一样的。

我用的是VS +MFC

主要方法是:

1、首先判断要生成的表tempTable是否已经存在,如果存在则先删除之(这一步主要是以防发生异常)

2、然后生成临时表tempTable,将查询结果存入其中

3、再给此临时表加一个ID列,将其属性设置为“自动编号”

4、最后将此临时表传递给DATAGRID控件,让其显示

代码及说明如下:

m_ptrRecordset-> CursorLocation = adUseClient;   //非常重要,如果没有,则无法显示数据

m_ptrConnection-> CursorLocation   =   adUseClient;

CString temp_s=L"";



long l=0;

_variant_t NO;

temp_s.Format(L"SELECT Count(*) AS RTab FROM MSysObjects WHERE (((MSysObjects.Name) Like \"%s\"));",L"tempTable");

//这条SQL语句是用于判断是否已经存在tempTable表,下面实现的是如果存在则将其删除

m_ptrRecordset=m_ptrConnection->Execute(_bstr_t(temp_s),COleVariant(l),adCmdText);

NO=m_ptrRecordset->GetCollect(COleVariant(long(0)));

if(NO.vt==VT_I4) //先判断是否存在tempTable表,如果存在则先将其删除

{

     if(NO.lVal>0)

     {

         m_ptrConnection->Execute(_bstr_t(L"drop table tempTable"),COleVariant(l),adCmdText);

     }

}





temp_Str.Format(L"select  Main.FileName ,Main.InningsNum ,Main.Date ,Main.ItemAttribute INTO tempTable from Main where Main.Date between #%s# and #%s#  ORDER BY Main.Id",startTime,endTime);

m_ptrConnection->Execute(_bstr_t(temp_Str),COleVariant(l),adCmdText);  

//此SQL语句,是将查询结果生成一个新表tempTable并将其保存在新生成的表中



m_ptrConnection->Execute(_bstr_t(L"alter table tempTable add id Counter "),COleVariant(l),adCmdText);

//这条语句实现修改新生成的tempTable表,给其新增加一列名为ID,属性是自动编号即Counter

//下面这篇文章包含了ACCESS中所有列的属性值

//http://hi.baidu.com/djiznew/item/0faef5eb8ddbede3fa42ba8c



if(m_ptrRecordset->GetState()==adStateOpen)  //判断数据集是否是打开的,如果打开则关闭

{

     m_ptrRecordset->Close();

}



HRESULT hr = m_ptrRecordset->Open(_bstr_t(L"select   id as [序号],FileName as [文件名],InningsNum as [局次],Date as [比赛时间],ItemAttribute as [项目属性]  from tempTable order   by   id"), _variant_t((IDispatch*)m_ptrConnection, TRUE),adOpenStatic, adLockBatchOptimistic, adCmdUnknown);

if(hr != S_OK)

{

     AfxMessageBox(L"create recordset error!");

     return;

}

            

m_dataGrid.putref_DataSource((LPUNKNOWN)m_ptrRecordset);  //实现将CRecordset与我们的DATAGRID控件连接起来

m_dataGrid.Refresh();  // m_dataGrid变量为关联DATAGRID控件的变量



this->m_ptrConnection->Execute(_bstr_t(L"drop table tempTable"),COleVariant(l),adCmdText);

//在连接DATAGRID后,删除tempTable表





存在问题:

由于msysobjects对象默认是不对外开放的,也就是不能修改的,所以我们必须先修改一些选项,然后才能实现它的操作,否则会在执行到

temp_s.Format(L"SELECT Count(*) AS RTab FROM MSysObjects WHERE (((MSysObjects.Name) Like \"%s\"));",L"tempTable");

这条语句时报错

解决办法:

在admin的权限里添加对msysobjects的更新操作就可以了嘛
默认的情况是admin对msysobjects没有任何权限!包括查询
access 2000下

工具 -> 选项 -> 视图 -> 隐藏对象、系统对象
前面的勾选上。

工具 -> 安全 -> 用户与组的权限,对象类型选择“表”
在对象名称中选定 MSysObjects ,然后权限中设置其权限。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表