如何根据条件改变C++Builder 的DBGrid的每行颜色以及在第一列增加一个多选框

deshun205 2006-08-30 09:21:08
问题1:如何根据条件改变C++Builder 的DBGrid的每行颜色.不要找Delphi的。因为DrawDataCell不同
问题2:如何在DBGrid第一列增加一个多选框,然后根据多选框的选择来选择数据进行打印,使用的是QReprot.
谢谢大家了!
...全文
1112 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
raulLW 2006-09-14
  • 打赏
  • 举报
回复
BlueDeepOcean(蓝色·深海) :

我重新提问了
http://community.csdn.net/Expert/topic/5021/5021739.xml?temp=.1894953

谢谢大家了!
谁知道?
raulLW 2006-09-14
  • 打赏
  • 举报
回复
这样是不好,我知道,下次一定注意。

刚碰上这样的问题,解决不了,就来这查查,结果有人问相同的问题,就......
BlueDeepOcean 2006-09-14
  • 打赏
  • 举报
回复
怎么都是借着别人的帖子问自己的问题?这样不好,做人要厚道哦。


楼上的判断Table的RecNo即可。
raulLW 2006-09-14
  • 打赏
  • 举报
回复
第一个问题怎么解决的呢?

问题1:如何根据条件改变C++Builder 的DBGrid的每行颜色.不要找Delphi的。因为DrawDataCell不同
BlueDeepOcean 2006-09-13
  • 打赏
  • 举报
回复
DBGrid->Options << dgRowSelect;
wuqiu217 2006-09-13
  • 打赏
  • 举报
回复
怎么选中一行呢?谢谢...
jaffy 2006-09-05
  • 打赏
  • 举报
回复
LS的说的对,第3方控件有的时候就是简单,快,不过兰色的精神更好.^_^
netliuming 2006-09-05
  • 打赏
  • 举报
回复
是的,如果没有第3方控件替换,按兰色的方法应该可行。
flowercity 2006-09-04
  • 打赏
  • 举报
回复
ehlib控件可以实现这个功能
deshun205 2006-08-31
  • 打赏
  • 举报
回复
To BlueDeepOcean(蓝色·深海) :如何把这个TCheckBox放在第一列呢?能不能给出具体的例子?
谢谢大家的参与!
BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
就是选择哪一行就打印哪一行,不选择的不打印。

嗯……算法比较简单,但是具体实现就比较麻烦了:

1、确定记录条数,这个应该可以得到的,利用Count属性;
2、根据Count,进行一个for循环,动态生成TCheckBox,需要注意的,这些TCheckBox的实例的
索引号一定要连续的,否则对后续操作有影响;
3、书写一个公共函数完成对选择的索引号的记录,比如:
int __fastcall TForm1::WhichCheckBoxChecked(TObject *Sender)
{
if (Sender->InheritsForm(__classid(TCheckBox)))
return ((TCheckBox*)Sender)->Components->Index; //好像这么写,记不清了
}
4、通过一个TStringList或者一个二维数组保存DBGrid中选择了CheckBox的记录。由于DBGrid
是二维表,因此需要用到一个循环;
5、打印。
deshun205 2006-08-31
  • 打赏
  • 举报
回复
To BlueDeepOcean :第一列的每一行均存在一个CheckBox .
deshun205 2006-08-31
  • 打赏
  • 举报
回复
不是ComboBox。CheckBox,就是把所有选中的记录进行打印。
netliuming 2006-08-31
  • 打赏
  • 举报
回复
LZ是要ComboBox的效果吧?
BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
第二个问题说的不是很清楚。在DBGrid的第一列生成CheckBox很简单,但是你所说的第一列增加一个多选框,
我的理解是放在Top-Left的位置,也就是单元格的(0,0)位置上是吗?
还是说第一列的每一行均存在一个CheckBox?
BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
在默认所有的表格行可见的情况下,给出你可以取出所选行的字段值的代码,这个代码我以ShowMessage显示的,你可以将他保存在TStringList中,之后利用两次循环的方式变为二维表:

.cpp

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TCheckBox *cb[MAX_PATH];
TStringList *sl; //用于保存为二维表
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
sl = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0;i < ADOTable1->RecordCount;i ++)
{
cb[i] = new TCheckBox(this);
cb[i]->Parent = this;
cb[i]->Name = "cb" + AnsiString(i + 1);
cb[i]->Left = DBGrid1->Left + 2;
cb[i]->Top = DBGrid1->Top + 19 * (i + 1);
cb[i]->Width = 10;
cb[i]->Height = 18;
cb[i]->Caption = "";
cb[i]->Visible = true;
cb[i]->BringToFront();
cb[i]->OnClick = WhichRecordNOChecked;
}
}
//---------------------------------------------------------------------------

.h

private: // User declarations
void __fastcall TForm1::WhichRecordNOChecked(TObject *Sender)
{
if (Sender->InheritsFrom(__classid(TCheckBox)))
{
if (((TCheckBox*)Sender)->Checked)
{
/* for testing
((TCheckBox*)Sender)->Name.SubString(((TCheckBox*)Sender)->Name.Pos("b") + 1,MAX_PATH).ToInt()
*/
ADOTable1->First();
if ((((TCheckBox*)Sender)->Name.SubString(((TCheckBox*)Sender)->Name.Pos("b") + 1,MAX_PATH).ToInt()) != ADOTable1->RecNo)
{
for (int i = 1;i < (((TCheckBox*)Sender)->Name.SubString(((TCheckBox*)Sender)->Name.Pos("b") + 1,MAX_PATH).ToInt());i ++)
ADOTable1->Next();
}
/*
ShowMessage(ADOTable1->RecNo); //for testing
*/
for (int c = 0;c < DBGrid1->Columns->Count;c ++)
ShowMessage(DBGrid1->Fields[c]->AsString);

}
}
}

BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
当然会出问题了,我这是默认所有行均显示的情况。
deshun205 2006-08-31
  • 打赏
  • 举报
回复
我拖拉右边的拖拉条,不会出问题吗?因为cb[i]不会移动的
BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
啊,忘了一句,就是

cb[i]->OnClick = WhichCheckBoxChecked; //上面定义的那个函数。
BlueDeepOcean 2006-08-31
  • 打赏
  • 举报
回复
根据记录条数,动态生成TCheckBox类的实例。打印的时候,可以在点击“打印”后,触发这个事件。

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TCheckBox *cb[MAX_PATH];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0;i < ADOTable1->RecordCount;i ++)
{
cb[i] = new TCheckBox(this);
cb[i]->Parent = this;
cb[i]->Left = DBGrid1->Left + 2; //调整系数
cb[i]->Top = DBGrid1->Top + 18 * (i + 1); //调整系数
cb[i]->Width = 10; //调整系数
cb[i]->Height = 18; //调整系数
cb[i]->Caption = "";
cb[i]->Visible = true;
cb[i]->BringToFront();
}
}
//---------------------------------------------------------------------------
加载更多回复(3)

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧