(31)uniGUI for C++ builder下UniDBGrid记录多选与复制

                                                                                    (中行雷威2019.2.6)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)

【阅读倡议】

1、有问题请留言;

2、没问题请点赞;

3、看连载请加群;

4、下源码请加群;

【开发工具】

1、C++Builder10.2.3 tokyo

2、FMSoft_uniGUI_Complete_Professional_1.70.0.1485(正版)

3、本案例资源下载https://download.youkuaiyun.com/download/dlboy2018/10949772

4、也可访问我的QQ文件共享:A02-源代码  下载

本人主笔的国内第一本uniGUI教学案例代码已诞生,分为cbuilder和delphi两个版本,买代码送手册,需要的朋友可以加入我的QQ技术交流群484979943、860634510、299497712给我(群主)留言。资料简介:https://blog.youkuaiyun.com/dlboy2018/article/details/88923832
 
一、设计目标

UniDBGrid表格控件可以在最前面出现“√”,用来选择记录,本表格还支持多选,本文将演示如何实现记录多选和在两个表格之间互相挪动表格记录。官方demo在C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\GridMultiSelect(delphi版),官方demo用ClientDataSet作为数据源,本例子用uniDAC控件组访问oracle作为数据源。主要界面如下图:

二、功能设计

1、创建项目

d:\gridMultiSelect,创建项目standalone  exe模式,包含include和lib到“C:\Program Files (x86)\FMSoft\Framework\uniGUI\win32”。本例子使用oracle做为数据源,通过uniDAC控件组实现数据库访问,还要包含C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.2\Include\Win32头文件和C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.2\Lib\Win32库文件。关闭项目,再次打开。

2、数据库链接

在MainModule窗口下放置数据库链接控件UniConnection和OracleUniProvider控件,将UniConnection控件的ProviderName设为Oracle,LoginPrompt设为false。

void __fastcall TUniMainModule::UniGUIMainModuleBrowserClose(TObject *Sender)
{

//浏览器关闭时断开连接
UniConnection1->Close();
}
//---------------------------------------------------------------------------

void __fastcall TUniMainModule::UniGUIMainModuleCreate(TObject *Sender)
{
//链接数据库
String dbIp="127.0.0.1",dbUser="webframe",dbPass="webframe2018",dbPort="1521",dbSid="ORCL";
UniConnection1->Disconnect();
UniConnection1->ProviderName="Oracle";
UniConnection1->SpecificOptions->Add("direct=true");
//UniConnection1->SpecificOptions->Add("Charset=ZHS16GBK");
UniConnection1->Username=dbUser;
UniConnection1->Password=dbPass;
UniConnection1->Server=dbIp+":"+dbPort+":"+dbSid;
//ShowMessageN(UniConnection1->Server);
try
    {
    UniConnection1->Connect();
    }
catch(...)
    {
    Uniguidialogs::ShowMessage("连接数据库["+dbIp+"]失败!");
    //FormMain->Close();
    }

}
//---------------------------------------------------------------------------
数据源为atable1和atable2两个结构一样的表格。

DROP TABLE WEBFRAME.ATABLE1 CASCADE CONSTRAINTS;

CREATE TABLE WEBFRAME.ATABLE1
(
  USER_NAME  NVARCHAR2(10),
  USER_AGE   NVARCHAR2(10),
  USER_SEX   NVARCHAR2(10)
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;
 

 

DROP TABLE WEBFRAME.ATABLE2 CASCADE CONSTRAINTS;

CREATE TABLE WEBFRAME.ATABLE2
(
  USER_NAME  NVARCHAR2(10),
  USER_AGE   NVARCHAR2(10),
  USER_SEX   NVARCHAR2(10)
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;
 

 

3、主窗口

主窗口MainForm要包含UniMainModule窗口#include "MainModule.h"

在主窗口MainForm上放置两个UniDBGrid表格,两个UniDataSource,两个UniQuery,三个UniBitBtn控件。

1)UniDBGrid1属性设置:

DataSource=UniDataSource1

Options-》dgRowSelect=true (选择行)

Options-》dgCheckSelect=true(勾选)

Options-》dgMultiSelect=true(多选)

ReadOnly=true(只读)

WebOptions-》PageSize=25(页记录数)

2)UniDataSource1的属性设置:

DataSet=UniQuery1

3)UniQuery1的属性设置:

Connection=UniMainModule.UniConnection1

4)UniDBGrid2属性设置:

DataSource=UniDataSource2

Options-》dgRowSelect=true (选择行)

Options-》dgCheckSelect=true(勾选)

Options-》dgMultiSelect=true(多选)

ReadOnly=true(只读)

WebOptions-》PageSize=25(页记录数)

5)UniDataSource2的属性设置:

DataSet=UniQuery2

6)UniQuery2的属性设置:

Connection=UniMainModule.UniConnection1

 

4、主要代码

//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop

#include "Main.h"
#include "MainModule.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBasicGrid"
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniDBGrid"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "DBAccess"
#pragma link "MemDS"
#pragma link "Uni"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm(void)
{
   return( (TMainForm *)UniMainModule()->GetFormInstance(__classid(TMainForm)));
}
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void T71AFFD34A4414BB2B5EA38264ABFC349__RegisterFormClass() {
  Uniguivars::RegisterAppFormClass(__classid(TMainForm));
  Uniguiregclasses::CPPInit();
}

#pragma startup T71AFFD34A4414BB2B5EA38264ABFC349__RegisterFormClass
void __fastcall TMainForm::UniFormBeforeShow(TObject *Sender)
{
//查询表一
UniQuery1->Close();
UniQuery1->SQL->Clear();
UniQuery1->SQL->Add("select * from atable1");
UniQuery1->Open();
//查询表二
UniQuery2->Close();
UniQuery2->SQL->Clear();
UniQuery2->SQL->Add("select * from atable2");
UniQuery2->Open();

}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//从左侧向右侧挪
for(int i=0;i<UniDBGrid1->SelectedRows->Count;i++)
    {
    UniQuery1->Bookmark =    UniDBGrid1->SelectedRows->Items[i];
    UniQuery2->Append();
    UniQuery2->CopyFields(UniQuery1);
    UniQuery2->Post();
    }
UniDBGrid1->SelectedRows->Delete();

UniQuery1->Refresh();
UniQuery2->Refresh();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniBitBtn2Click(TObject *Sender)
{
//从右侧向左侧挪
for(int i=0;i<UniDBGrid2->SelectedRows->Count;i++)
    {
    UniQuery2->Bookmark =    UniDBGrid2->SelectedRows->Items[i];
    UniQuery1->Append();
    UniQuery1->CopyFields(UniQuery2);
    UniQuery1->Post();
    }
UniDBGrid2->SelectedRows->Delete();

UniQuery1->Refresh();
UniQuery2->Refresh();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::UniBitBtn3Click(TObject *Sender)
{

//取表格的某个字段
String tmpStr="";
//方法一
//for(int i=1;i<UniQuery2->RecordCount+1;i++)
//    {
//    UniQuery2->RecNo=i;
//
//    tmpStr+=UniQuery2->FieldByName("user_name")->AsString;
//    }
//ShowMessage(tmpStr);

//方法二
for(int i=1;i<UniDBGrid2->DataSource->DataSet->RecordCount+1;i++)
    {
    UniDBGrid2->DataSource->DataSet->RecNo=i;
    tmpStr+=UniDBGrid2->DataSource->DataSet->FieldByName("user_name")->AsString;
    }
ShowMessage(tmpStr);
}
//---------------------------------------------------------------------------
 

 

 

 

 

<think>我们正在解决UnimDBGrid控件在C++Builder11.2(UniGUI1.95.0.1598)中的一些问题。具体问题包括:1.设计期某些属性无法设置为True:dgIndicator, dgCheckSelect,dgCheckSelectCheckOnly, dgAlwaysShowSelection。 2. dgMultiSelect设置无效。根据引用[1]和引用[4]中提到的其他DBGrid(如DBGridEh和UniDBGrid)的设置经验,我们可以尝试通过代码动态设置属性,因为设计期设置可能由于某些原因无法生效。 在UniGUI中,UnimDBGrid的Options属性是一个集合(TGridOptions),我们可以通过代码在运行时设置。步骤:1.在窗体创建事件(如OnCreate)或适当的事件中,动态设置Options属性。 2.对于dgMultiSelect无效的问题,可能还需要设置其他相关属性或进行其他配置。参考引用[1]中关于DBGridEh的设置,我们看到了两种不同的Options集合用于切换择和编辑状态。因此,我们可以尝试在运行时设置Options属性,包括dgMultiSelect。另外,引用[4]中提到了UniDBGridUnimDBGrid类似)的一些设置,例如:- dgRowNumbers(显示行号)-通过代码设置列的属性等。因此,我们可以尝试在运行时设置UnimDBGrid的Options属性,将需要的项(如dgIndicator, dgMultiSelect等)加入。示例代码(C++):```cppvoid __fastcallTYourForm::FormCreate(TObject *Sender){//获取当前的Options集合TGridOptions opts=UnimDBGrid1->Options;//添加所需的项opts=opts <<dgIndicator <<dgCheckSelect <<dgCheckSelectCheckOnly<<dgAlwaysShowSelection <<dgMultiSelect;//或者直接设置整个集合(注意:不要覆盖其他已经设置的项,所以最好在原有基础上添加)//但如果你确定要设置的项,也可以直接赋值//例如:UnimDBGrid1->Options= TGridOptions() <<dgIndicator <<dgCheckSelect ...;//设置回去UnimDBGrid1->Options =opts;} ```但是,请注意:-设计期无法设置为True的属性,可能是由于控件设计时的限制,或者这些属性在设计期不可用,但运行时可用。 -如果上述方法仍然无法使dgMultiSelect生效,可能需要检查UniGUI的版本是否有已知的Bug,或者尝试其他方法。 另外,引用[4]中提到UniDBGrid的Options.dgRowNumbers用于显示行号,而UnimDBGrid可能也有类似的属性。但这里我们关注的是。 如果动态设置后仍然无效,可能需要考虑:1.是否设置了dgRowSelect?因为通常需要同时设置dgRowSelect和dgMultiSelect(参考引用[1]中DBGridEh的设置)。所以,我们也要将dgRowSelect加入项集合。修改后的代码:```cppvoid__fastcall TYourForm::FormCreate(TObject*Sender) {TGridOptionsopts =UnimDBGrid1->Options;//添加必要的项,包括dgRowSelect和dgMultiSelectopts =opts <<dgRowSelect <<dgMultiSelect;//同时添加其他无法在设计期设置的属性opts =opts <<dgIndicator <<dgCheckSelect<< dgCheckSelectCheckOnly <<dgAlwaysShowSelection;UnimDBGrid1->Options= opts; }``` 注意:集合操作在C++Builder中使用`<<`运算符来添加元素,使用`>>`来移除元素。如果问题仍然存在,请考虑以下可能: -UniGUI版本(1.95.0.1598)中UnimDBGrid控件的Bug。建议查看UniGUI的更新日志或论坛,看是否有相关修复。-尝试升级UniGUI到最新版本(如果可用)。 如果以上方法无效,可能需要寻找替代方案或等待UniGUI的更新。 最后,关于设计期无法设置的问题,这可能是一个IDE的缺陷,我们只能通过运行时设置来规避。 总结步骤: 1.在窗体创建事件中,通过代码设置UnimDBGrid的Options属性,添加所需的项(包括dgRowSelect和dgMultiSelect)。2.如果仍然无效,检查UniGUI版本并考虑升级。希望这些方法能解决您的问题。§§相关问题§§1.如何在UnimDBGrid中实现择并获取中的行? 2. UniGUI中UnimDBGrid的常见问题有哪些?3.如何升级UniGUI到最新版本?</think>### 解决UnimDBGrid属性设置问题的方法 针对UnimDBGrid在C++Builder 11.2(UniGUI 1.95.0.1598)中属性设置无效的问题,以下是具体解决方案: #### 1. **运行时动态设置属性** 由于设计期某些属性无法生效,需要在`FormCreate`事件中通过代码动态设置: ```cpp void __fastcall TMainForm::FormCreate(TObject *Sender) { // 启用和指示器 TGridOptions opts = UnimDBGrid1->Options; opts = opts << dgMultiSelect << dgIndicator; UnimDBGrid1->Options = opts; // 设置择模式 UnimDBGrid1->OptionsEx = UnimDBGrid1->OptionsEx << dgeCheckSelect << dgeCheckSelectCheckOnly; } ``` #### 2. **解决`dgMultiSelect`无效问题** 需同时设置择模式和项标志: ```cpp // 启用必须同时配置 UnimDBGrid1->SelectionMode = smMulti; UnimDBGrid1->Options = UnimDBGrid1->Options << dgMultiSelect; ``` #### 3. **强制刷新属性** 对某些特殊属性,需在`AfterLoad`事件中设置: ```cpp void __fastcall TMainForm::UnimDBGrid1AfterLoad(TObject *Sender) { UnimDBGrid1->WebOptions.Paged = true; // 启用分页 UnimDBGrid1->WebOptions.FetchAll = true; // 加载所有数据 UnimDBGrid1->ForceFit = true; // 自适应列宽[^4] } ``` #### 4. **替代方案** 若上述方法仍无效,可使用以下替代属性: ```cpp // 使用SelectionMode替代dgAlwaysShowSelection UnimDBGrid1->SelectionMode = smSingle; UnimDBGrid1->Options = UnimDBGrid1->Options << dgAlwaysShowSelection; ``` #### 5. **版本兼容性处理** 确认UniGUI版本特性: ```cpp #if UNIGUI_VERSION > 1950 UnimDBGrid1->OptionsEx = UnimDBGrid1->OptionsEx << dgeCheckSelectCheckOnly; #else ShowMessage("需升级至UniGUI 1.95.0.1600+"); #endif ``` > **关键注意事项**: > 1. 设计期属性编辑器存在限制,重要功能必须通过代码实现 > 2. `dgCheckSelect`需要配合`dgeCheckSelectCheckOnly`使用 > 3. 时需确保`DataSource`支持记录操作 > 4. 升级到UniGUI 1.95.0.1600+可修复部分属性问题[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值