【发布时间】:2018-10-25 17:48:50
【问题描述】:
我已经看到,如果数据以另一种形式(以及 DataSet)更改,或者即使数据在服务器端(在触发器中或来自另一个用户)更改,则仅刷新当前行会出现问题。 所以我找到了部分适用于 DevExpress 的 cxGrid 的解决方案,并且有以下问题。
frm:=TfrmEdb01.Create(Self); // create edit-form
try
frm.LoadData(0); // do the insert in TAdQuery
frm.ShowModal; // Show edit form
// after closing an Edit-Form, make a new record in cxGrid
row:=tv01.dataController.InsertRecord(tv01.Controller.FocusedRecordIndex);
// for each column in grid...
for col:=0 to tv01.DataController.ItemCount-1 do
begin
// ...get its FieldName
sFld:=tv01.DataController.GetItemFieldName(col);
// and if this field exist in edit-form's Query
if frm.q01.FindField(sFld)<>nil then
//then assign this value to the newly created row in the grid.
tv01.DataController.Values[row,col]:=frm.q01.FieldByName(sFld).Value;
end;
finally
frm.Free;
end;
真的,当我退出编辑表单时,在 cxGrid 中创建了一个新行。问题在于: - 如果被双击(再次打开编辑表单),则打开前一条记录。在我看来,数据实际没有在 Query 对象中更新,仅在 GridView 中......也许我应该使用 Grid 中的值而不是 Query 对象。 - 如果选择另一条记录(上下滚动),然后想再次选择这条新记录,则根本无法聚焦。只有当我重新加载整个数据集时,才能像选择其他记录一样选择这条新记录。
干杯!
附言为了解决一个问题,我将提供整个测试项目。还有 SQL 脚本可以在数据库中创建表,并且 AnyDac 连接必须设置为您的数据库。 还有一张图片可以/应该说明问题。
【问题讨论】:
-
您是否尝试(暂时)将 TDBNavigator 添加到与您的 cxGrid 相同的表单中?这应该会向您显示数据集处于什么状态,这可能与您认为的不同。
-
网格底部有一个导航器,但是执行完这个for循环后什么都没有改变。但是,最大的问题是为什么这个新记录根本不能被选中。
-
好吧,在我看来,您可能会以错误的方式解决这个问题 - 我不会尝试将值复制到网格的数据控制器中,而是在数据控制器的数据集中创建一条新记录,然后把它留给网格去做它应该做的事情,即显示东西而不是复制数据。试图在 cxGrid in 中操作数据几乎总是错误的做法 - 而是操作数据集的数据。
-
我可能不会也不能在实时数据集 (TAdQuery) 上执行插入操作。也许如果使用 TClientDataSet,那么可以在运行时手动添加记录。但事实并非如此。
-
在我看来,您正在与您正在使用的 TDataset-descendant 中的状态机进行斗争。当您尝试使用 db-aware 组件(如 cxGrid DBTableView)来操作数据时,就会发生这种情况。