在websnap中如何获得DataSetAdapter列表中当前点击行的数据资料? (100分)

  • 主题发起人 主题发起人 mauhan
  • 开始时间 开始时间
M

mauhan

Unregistered / Unconfirmed
GUEST, unregistred user!
如:
设备代码 设备类名 设备分类 设备全称 使用部门 使用状态 操作
780-0059 电脑 2 电脑 JJA102 0 详细资料
780-0062 电脑 2 电脑 JJA102 0 详细资料
785-0031 打印机 2 Epson Lq1600K JJA102 0 详细资料
当我点击详细资料按钮的时候,怎么样才能够取得所点击行的设备代码等资料?
我在该按钮的BeforeExecute时间中用如下代码,但是取得一直是第一行的数据,请哪位朋友指点迷津。
procedure TEquipGrid.ActionBrowseRowBeforeExecute(Sender: TObject;
Params: TStrings; var Handled: Boolean);
var
LocateParams:TLocateParams;
begin
LocateParams := dsaSearchResult.LocateParamsList.add;
LocateParams.AddParam('Equip_Code', AdaptEQUIP_CODE.Value);
LocateParams.AdapterName:=dsaSearchResult.Name;
dsaSearchResult.Locate;
Handled := true;
end;
 
我的方法是:
详细资料
procedure TEquipGrid.ActionBrowseRowGetParams(Sender: TObject; Params: TStrings);
begin
params.value['Equip_Code']:=AdaptEQUIP_CODE.Value//设备代码的数据;
end;
procedure TEquipGrid.ActionBrowseRowExecute(Sender: TObject; Params: TStrings);
var
LocateParams:TLocateParams;
begin
LocateParams := dsaSearchResult.LocateParamsList.add;
LocateParams.AddParam('Equip_Code', params.value['Equip_Code']);
LocateParams.AdapterName:=dsaSearchResult.Name;
dsaSearchResult.Locate;
end;
 
用本身的Edit可以直接从adapterfield中读取
 
这个问题我也遇到,

我的方法是只用TTable,定位用DataSet的Filter来定位,那样点击“详细资料”
就可以到正确的记录

若是改用TQuery控件,用SQL语句来获取数据后,点击那个记录都是去到数据集的第一条
记录
 
我也遇到过这个问题,好像:

用TTABLE控件,用Filter属性来定位数据,在“详细资料”就可以正确到指定记录;

若用TQUERY的SQL来查询数据,对查询出来的数据集再“详细资料”就始终会去到查询结果
的第一条记录

 
问题是怎么得到点击的内容啊,也就是怎样得到点击的是哪一条记录。
 
嗨,我回答的原代码很清楚了。
详细资料 是作为一个按钮或联接
procedure TEquipGrid.ActionBrowseRowGetParams(Sender: TObject; Params: TStrings);
begin
params.value['Equip_Code']:=AdaptEQUIP_CODE.Value//设备代码的数据;
end;
把记录的设备代码的数据放在 详细资料 的事件中。在点击 详细资料触发Execute事件
时params.value['Equip_Code'] 就是该条记录的 详细资料 的数据。

 
:yyljt
如果我的资料是动态自己生成的,既非按钮也非联接,就是单纯的文字。
该如何得到点击的内容?
 
ego
问了我想问的。。。。。。。。。 关注[8D][8D][8D]
 
偶问得是不是很......变态???
 
我想在WEBSNAP中把资料显示在网页中离不开Adapter,数据库的是DataSetAdapter,无论是
动态自己生成的还是其它生成的,在Adapter或DataSetAdapter中的fields设置显示的field
在actions中设置要点击的事件。AdapterPageProducer生成网页的数据时在AdapterGrid中
加入AdapterCommandColumn,在AdapterCommandColumn加入actions。这样每一行数据都有
一个actions,通过
procedure TEquipGrid.ActionBrowseRowGetParams(Sender: TObject; Params: TStrings);
begin
params.value['Equip_Code']:=AdaptEQUIP_CODE.Value//设备代码的数据;
 ...//可以放置很多的参数,只要你想用到的都可以放
end;
 把关键字段的数据放在actions中,这样点击后通过ActionExecute事件用 params.value['Equip_Code']
可以得到你放置的参数你可以用它去查数据库等等。
 
我希望通过WebSnap可以将AdapterGrid中的内容可以用超链接显示, 就像大富翁网页的标题
那样, 无需再多一个按钮来查看详细信息(这样界面会简洁很多)

IntraWeb就可以,但在WebSnap就不知道怎么弄了
 
catfox:
呵呵,“英雄”所见略同!偶在玩websnap时也是这么想的!
所以,我不用AdapterGrid,干脆直接在程序中
response.content := '<a href="ViewPage/?ID=' + query.fieldbyname('ID').asstring + '</a>';
这样,别人一点就使页面自己跳到浏览页去了。然后在浏览模块中用
request.querycontent.value['ID']
来得到要浏览的序号。但总感觉这样有些“怪怪地”。 ^_^

yyljt、catfox啊,你们有什么好办法吗?
 
简单啊,默认的是按钮,在displaytype 属性中选择ctAnchor是超联接,这样按钮成了超联接
ctImage在我的程序中不是很灵,可能是我的程序中有login的页面,用了ctImage就跳到login
页面了,我就在网页中修改成image。
 
to yyljt:
这样是可以将按钮变成超链接,但我是想让[red]数据集中的某列[/red]成为超链接

 
如果数据集中的某列成为超链接是转到其它页上去的可以在网页中修改JScript或VBScript
如: <td><div><% WriteColText(vDataSetAdapter1_Phone.DisplayText) %></div></td>
<td><div><a href="...."><% WriteColText(vDataSetAdapter1_Phone.DisplayText) %></a></div></td>
如果是在本页中处理的把“按钮变成超链接”的显示改为你要显示的数据。
如: <a href="" onclick="AdapterForm1.__act.value='<%=vDataSetAdapter1_AdapterAction.LinkToPage(Page.Name, Page.Name).AsFieldValue%>';AdapterForm1.submit();return false;"><% WriteColText(vDataSetAdapter1_Phone.DisplayText) %></a>
就可以了。
也可以在Adapter或DataSetAdapter中的字段的onGetDisplayText事件中修改
如:value:='<a href="ddasdfa?dd='+AdaptCity.Value+'">'+AdaptCity.Value+'</a>';
这样可以把要成为超链接的某列成为超链接了。


 
谢谢大家的热情作答。
yyljt君用参数的方法,我今天晚上测试以后再来答复。
其实,我现在解决的办法比较土,就是在程序中直接用RESPONSE写一段带有参数的代码链接到指定的页。
(但是转到的页面一定是Published,不然会出错。为了防止直接切换到该显示页,我的解决帮法是在为每个页面建立一个模板作为页面的开头,当中加一个判断语句,如果是这个页面就不要显示,这样就必须通过点链接才能转到该页了)。
其中EGO提出的不用增加一列,直接用记录作为连接也是个好办法。不过这样就不能用AdapterGrid控件了。


 
[^]

在Demo中的MasterDetail中原来也有这个例子,就是yyljt所说的

WebSnap中还是比较多的地方要JS来协调,不是很R&D
 
谢谢yyljt的答案。
 
后退
顶部