Delphi 手工创建TClientDataset 及动态添加数据后最后一条记录不显示的解决方法

procedure TForm1.Button6Click(Sender: TObject);
var
dsTemp:TClientDataSet;
begin
   dsTemp:=TClientDataSet.Create(nil);
 { 添加字段 }
  with dsTemp.FieldDefs.AddFieldDef do
  begin
    Name := 'ID';
    DataType := ftInteger;
  end;

  with dsTemp.FieldDefs.AddFieldDef do
  begin
    Name := 'Name';
    DataType := ftString;
    Size := 12; { ftString 类型的 Size 默认 20 }
  end;

  with dsTemp.FieldDefs.AddFieldDef do
  begin
    Name := 'Age';
    DataType := ftWord;
  end;

  with dsTemp.FieldDefs.AddFieldDef do
  begin
    Name := 'Sex';
    DataType := ftBoolean;
  end;

  { 构建数据集, 不可缺少的一步 }
  dsTemp.CreateDataSet;

  { 显示; 如果在设计时已挂接或不需要显示, 可省略下两行 }
  ds.DataSet := dstemp;

  { 添加数据 }
  dsTemp.AppendRecord([1, '张三', 33, True]);
  dsTemp.AppendRecord([2, '李四', 44, False]);
  dsTemp.AppendRecord([3, '王五', 55, True]);
  dsTemp.AppendRecord([4, '刘七', 505, True]);

     //QryCom.DataSource:=ds;
   MainView.ClearItems;
   MainView.DataController.CreateAllItems();
   QryComAfterOpen(ds.DataSet);
  //DBGrid1.DataSource := DataSource1;

  { 保存为 cds 或 XML }
  dsTemp.SaveToFile('C:\Temp\TestBinary.cds');
  dsTemp.SaveToFile('C:\Temp\TestXMLUTF8.xml', dfXMLUTF8);
end;

手工CreateDataSet之后,如果添加数据是循环动态添加的,在最后操作完成后一定要加上Dataset.Post; 否则会出现最后一条记录消失的情况。

  Dataset.DisableControls;
  for j := 0 to ja.Length - 1 do
  begin
    Dataset.Append;
    jf := ja.o[j];
    for k := 0 to Dataset.FieldCount - 1 do
    begin
      sValue := jf.AsObject.GetValues.AsArray[k].AsString;  //取DATA节点下的字段值
      Dataset.FieldByName(ColList[k]).AsString := sValue;
      // Dataset.AppendRecord(sValue); //用这个方法要先拼接字符串
    end;
    // Dataset.AppendRecord([1, '张三', 33, True]);
  end;
  Dataset.Post; //不加这句,最后一条记录看不到
  Dataset.EnableControls;

 

posted @ 2022-10-04 00:15  IT情深  阅读(134)  评论(0编辑  收藏  举报