C++Builder 程序员博客
4 Sep
虽然是老问题,但是大家似乎都忽略了一个问题,if(dbgrd1->DataSource->DataSet->RecNo%2),在用RecNo判定时,只对特定数据库有用,所以对于SQL,根本没有用,也不会看到隔行显示的结果,,在SQL中建立id字段,此句改为 if(Query1->FieldByName("id")->AsInteger%2),就解决问题啦!完整代码如下:
if(Query1->FieldByName("id")->AsInteger%2)//关键语句
{
suiDBGrid1->Canvas->Brush->Color=0×00FFF5E8;
suiDBGrid1->Canvas->Font->Color=clBlack;
}
else
{
suiDBGrid1->Canvas->Brush->Color=0×00E8E8E8;
suiDBGrid1->Canvas->Font->Color=clBlack;
}
suiDBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
顶!
23 Aug
例如我有一个表,保存了学生档案。
然后我在DBGrid或DBGridEh中,增加学生时,录入“王”时,
能出现一个下拉列表框,显示出所有“王”姓的学生,我直接选择需要的名字即可,
后面的字符就不要再录入了。
请问怎样才可以实现这样的效果?
楼上是否明白我的意思?
要像google搜索中的那样,互动的一种检索显示
http://topic.csdn.net/u/20070309/10/038d9d66-afab-4b80-b07d-82ebe856a5f4.html
该回复于2008-07-10 02:38:32被版主删除
22 Aug
一表中有字段A和B
如果A和B的值不同就变色
请问该怎样做,谢谢
if (ClientDataSet1A->Value!=ClientDataSet1B->Value)
DBGridEh1->Canvas->Brush->Color=clAqua;
DBGridEh1->DefaultDrawDataCell(Rect,Column->Field,State);
谢谢楼上,
但不用DBGRIDEH1只用DBFRID有没有办法实现
2楼的做法同样可以用于DBGrid,
在DBGrid的OnDrawColumnCell事件中可以更改字体和填色。
void __fastcall TForm1::DBGridDrawColumnCell(
TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if(A字段值==B字段值)
{
DBGrid->Canvas->Brush->Color=clAqua;
}
DBGrid->DefaultDrawColumnCell(Rect,DataCol, Column, State);
}
DataSet的DisableControls();方法可以临时禁止相关的数据展现控件(比如DBGrid)刷新,对应的反方法则是EnableControls();
一般在对数据集做某些更新时不期望过程中数据展现控件不停的刷新,可以如下写法:
DataSet->DisableControls();
//此时对DataSet进行更新或者浏览等操作
DataSet->EnableControls();
谢谢,第二个问题解决了.
第一个问题的 if(A字段值==B字段值)
该用什么格式 直接打字段名字报错
谢谢
if(DBGrid->DataSource->DataSet->FieldByName("A字段名")->AsString!=DBGrid->DataSource->DataSet->FieldByName("B字段名")->AsString)
弄好了, 太感谢了.
5 Aug
请高手指教
前面有很多人发过帖子问这个问题了 找找看。
老问题了
明天去公司给你代码
妖哥网站
或者ehlib控件
有非常多的类似的问题了…反正我是问过不少了……..搜索下,,答案多多
个人感觉ehlib控件不错,直接导出
贴一个以前的代码, BCB 6.0 通过,不过有好久不用BCB了
//把数据集导出到Excel void __fastcall TDM::ExportDataSetToExcel(TDataSet * DataSet) { if(!DataSet->Active) throw Exception("数据集没有打开!"); if(DataSet->RecordCount==0) throw Exception("没有可以导出的记录"); Variant excel,wb1,ws1,cell; try { excel=Variant::CreateObject("Excel.Application"); try { //excel.Exec(PropertySet("Visible")<<true); wb1=excel.Exec(PropertyGet("WorkBooks")); wb1.Exec(Procedure("Add")); wb1=excel.Exec(PropertyGet("ActiveWorkbook")); Variant v=wb1.Exec(PropertyGet("Worksheets")); ws1=v.Exec(PropertyGet("Item")<<1); int fc=DataSet->Fields->Count; int i=0,j=0; DataSet->DisableControls(); DataSet->First(); for(j=0;j<fc;j++){ ws1.Exec(PropertySet("Cells")<<1<<j+1 <<DataSet->Fields->Fields[j]->DisplayLabel); } while(!DataSet->Eof){ i++; for(j=0;j<fc;j++){ ws1.Exec(PropertySet("Cells")<<i+1<<j+1 <<DataSet->Fields->Fields[j]->Value); } DataSet->Next(); } excel.Exec(PropertySet("Visible")<<true); } catch (Exception &e){ try{ excel.Exec(Procedure("Quit")); } catch(…) { } Application->ShowException(&e); } } __finally { DataSet->EnableControls(); } } //—————————————————————————
ehlib
如果只想简单的转换成.xls,可用文本格式的xls,既快又简单,
唯一的缺点不含控制格式.
列与列用 tab:chr(8)隔开,行与行用 \r\n隔开,
文本格式,写起来太方便了;
5 Aug
使用Query查询出来的结果想进行修改说不能对只读的dataset修改
代码如下
Query1->First();
Query1->RequestLive=true;
do{
Query1->Edit();
DBGrid2->Fields[6]->Value="是";
Query1->Next();
}while(!Query1->Eof);
那请问怎么用SQL进行更新,能举个例子不
设置RequestLive属性为true试一下。
用TABLE 也可以
Table1->First();
do{
Table1->Edit();
DBGrid1->Fields[1]->Value=3;
Table1->Next();
}while(!Table1->Eof);
Table的速度相对比较慢。还是Query好
sql语句更新就是用sql的insert \ update更新数据
能用就行
我的代码是这样的啊
Query1->First();
Query1->RequestLive=true;
do{
Query1->Edit();
DBGrid2->Fields[6]->Value="是";
Query1->Next();
}while(!Query1->Eof);
但是提示错误不能对只读的dataset修改
4 Aug
记录太多,一次显示下来速度太慢了,早都知道可以翻页,不知道怎么弄,哪位高手给咱讲讲。。。。谢谢。
TSimpleDataSet中的 PacketRecords 就是用来控制翻页的
真的不知道你在说什么,你到底是要实现分页呢还是只想把它翻翻页,如果是翻翻页直接发个消息就了事了。如果是想实现分页的话,就自己后台处理了,与dbgrid好像没有任何关系。
select top n from table where …
该回复于2008-07-19 16:11:39被版主删除
3 Aug
最近在网上搜索了不少打印 DBGRID 内容的例子,都得不到解决
去 http://www.ccrun.com/article.asp?i=29&d=vpk07a# (如何快速自动生成并定制报表)
看了这篇文章,可是又用不了,谁能帮我改下下,或者有更好的例子
发到我邮箱 chj.lee@126.com,能用就给分,非常感谢!
打印dbgrid还是推荐用dbgrideh控件。
用dbgrideh控件
该回复于2008-07-27 11:22:04被版主删除
实际上打印BDGrid数据就是答应其DataSource中的数据,你可以使用报表工具打印,很容易连上即可,如果你
非要自己打印,那你就自己设计表格从DataSoure中读取数据,不要管DBGrid。
非常感谢大家,我用了dbgrideh
用第三方控件吧
搞定,给兄弟们发分。
1 Aug
DBGrid里显示有部门一列,该列是有限制的,如只能是"研发,技术,项目,人事,财务….",性别一列只能是"男,女(勉强空也行)"
我在添加数据的时候,部门列是用Combox固定的几个选项,不可更改,最好是在DBgrid里也能弄能Combox那样的,有达人能做到吗?
实在不行,还有就是"男,女"那个,怎么在我点"修改"按钮的时候,得到要修改的字符串,我做一下判断,如果不是"男,女"就提示,修改不成功.
用PickList属性可以做到某一列显示的是下拉菜单。可以做到显示你的性别!
用PickList属性可以做到某一列显示的是下拉菜单。可以做到显示你的性别!
或者你做一個畫面 用wwDBComboDlg1控件的onCustomDlg事件打開那個畫面,並賦值
在DBGrid不用加wwDBComboDlg1控件
設置DBGridEh.Columns[x]的ButtonStyle的屬性為cbsEllipsis也可以達到你的要求
找到PickList了,也加了Strings,可运行的时候显示不出来下拉列表,好多人和我有同样的问题,问了也问不出什么.
http://topic.csdn.net/t/20020417/20/655438.html#
很多人说是把ButtonStyle设为cbsAuto,我试了不行,4楼说设为cbsEllipsis,我也试,也不行
我看了一下帮助说明,应该是auto
cbsAuto If the column is associated with a lookup field or has a value assigned to its PickList property, the grid displays a combo box in the column. The user can choose a value from the drop-down list.
1 Aug
比如我有一列是电话号码
如果像edit中那样用
OnKeyPress事件判断,那DBGrid上所有的列都只能输入数字了,所以这个判断加在哪儿?
这种一般可以针对DBGrid数据集的字段直接限定其允许字符,例子:
TFieldChars AllowChars;
AllowChars.Clear();
AllowChars < <'0' < <'1' < <'2' < <'3' < <'4' < <'5' < <'6' < <'7' < <'8' < <'9';
DataSet1->FieldByName("F1")->ValidChars=AllowChars;
这样DataSet1的F1字段只允许输入0~9这样的数字,在相应的DBGrid、DBText等数据控件中都能生效。
大哥,算法我可以动脑子,可这是技术~~~~~
就像楼上这位仁兄虽然给了我明确的代码,但放在哪儿,确实是我该自己动脑子的地方
最近两天看楼主这么活跃,真是服了
原来程序员是这样炼成的
胡一刀大哥,你救了我的命了,感激不尽
其实早以前也很活跃,在上一家公司做一个时间控件,当时ccrun都说我最近比较活跃,一直没怎么接触数据库,重新学起
我也是感慨颇多,这个星期一上班,要我在一周之内做一个网络版的数据库程序,要有打印功能,给了一些条件,让自己设计表,这可愁坏我了,第一天一筹莫展,根据以前经验,每次遇到不可能完成的任务mission impossible,可能只过一天,就变成了简单的问题impossible is nothing.可这次不一样,换了新的环境,没人可以问,只有我一个用CB的,没有书可以查,搬家没带过来,甚至第一天没有网可以上,现在可以了.到现在,只差一个打印功能了,感觉欣慰呀,我问了一下报表怎么做,头儿说,报表很简单,我相信你能看懂,可我看,报表都是那么复杂.
31 Jul
dbgrid中有两条记录,每个记录有两个字段char [A] int [B]
如 小明 90
小刚 80
POST后求[B]的和:80+90=170
现在问题是 小刚80 改成85 改完后没有离开本行,即还是修改状态中,没有POST这一行,问如何既时获得[B]的和是170 还是175
不需要post,只要离开该cell就可以计算了。
TO:lurel(城市陌生人)
对啊.人家也是这样实现的,但程序如何操作呢,望指教