เลือกแถวหลังจากรีเฟรช DBGrid

คำถาม n00b บางอย่างจากฉัน ฉันท่องเน็ตและคำถามที่คล้ายกันที่นี่แล้ว แต่ยังไม่พบคำตอบที่ถูกต้องสำหรับปัญหาง่ายๆ (อย่างที่คิด)

ฉันมี DBGrid ฉันเลือกหนึ่งแถวและดำเนินการบางอย่างกับข้อมูลอื่นที่เชื่อมโยงกับแถวนี้ หลังจากที่ฉันเสร็จสิ้น DBGrid ของฉันจะถูกรีเฟรชและแถวที่เลือกจะถูกรีเซ็ตเป็นแถวแรก ฉันต้องการรับแถวเดียวกับที่เลือกไว้ก่อนที่จะรีเฟรชข้อมูล DBGrid มีข้อเสนอแนะอะไรบ้าง?


person Vlad    schedule 25.10.2009    source แหล่งที่มา


คำตอบ (3)


ก่อนที่จะรีเฟรช ให้บันทึกการเลือกปัจจุบันของชุดข้อมูลที่เชื่อมโยงไว้เป็นบุ๊กมาร์ก จากนั้นจึงกู้คืนบุ๊กมาร์กในภายหลัง

person Mason Wheeler    schedule 25.10.2009

คำตอบนี้มีวัตถุประสงค์เพื่อเป็นอาหารเสริมรองของ Mason ไม่ใช่ทางเลือกอื่น ฉันได้เพิ่มมันเพียงเพราะมีคำตอบอื่นปรากฏขึ้นโดยแนะนำ imo ไม่ถูกต้องการใช้คุณสมบัติ RecNo ของชุดข้อมูล ทายาท TDataSet บางตัวเท่านั้นที่ใช้ RecNo ได้อย่างน่าเชื่อถือหรือเลย ผู้สืบทอดบางรายเพียงแค่คืนค่าคงที่เช่น 0 สำหรับ RecNo ของแถวปัจจุบัน และไม่ทำอะไรเลยเมื่อคุณกำหนดค่าให้กับมัน

procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet);
var
  Bookmark : TBookmark;
begin
  Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet

  try
    Screen.Cursor := crSqlWait;  // Show the user that something is happening
    Update;  // update the form to make sure screen cursor updates
    ADataSet.DisableControls;
    // do something with ADataSet here  e.g.
    ADataSet.First;
    while not ADataSet.Eof do begin
      // do something with current row here, then
      ADataSet.Next;
    end;
  finally
    ADataSet.GotoBookmark(Bookmark);  // Return to where you were at outset
    ADataSet.FreeBookmark(Bookmark);
    ADataSet.EnableControls;
    Screen.Cursor := crDefault;  // Let the user see you're done
  end;
end;
person MartynA    schedule 27.07.2014
comment
Boommark ทำงานเหมือนกับ RecNo ? หรือไม่ ? ตัวอย่างเช่น: หากฉันได้รับบุ๊กมาร์ก ให้ลบบันทึกบางส่วนก่อนบันทึกที่เลือก และต่อไปฉันจะไปที่บุ๊กมาร์ก ตอนนี้บันทึกที่เลือกจะเหมือนกับบันทึกที่เลือกก่อนที่จะลบ ? กล่าวอีกนัยหนึ่ง: จัดเก็บบุ๊กมาร์กเพียง RecNo หรือ Position of record หรือเก็บข้อมูลอื่นเกี่ยวกับบันทึกที่เลือก ? - person G3ntle_Man; 02.10.2015
comment
ฉันคิดว่ามันขึ้นอยู่กับวิธีการใช้บุ๊กมาร์กในสืบทอดหรือ TDataset แต่ฉันจะแปลกใจถ้ามีคนทั่วไปคนใดคนหนึ่งใช้เพียงหมายเลขบันทึก จากข้อมูลบางส่วนที่ฉันได้ตรวจสอบ โดยทั่วไปแล้วจะใช้บัฟเฟอร์ซึ่งมีข้อมูลเฉพาะการใช้งาน หากสงสัยว่าชุดข้อมูลประเภทที่กำหนดใช้บุ๊กมาร์กหรือไม่ ให้เรียกใช้ฟังก์ชัน BookmarkValid (ดู OLH) - person MartynA; 03.10.2015
comment
ขอบคุณ ฉันลองใช้ GetBookmark และ GotoBookmark สำหรับบันทึกที่ถูกลบ : GetBookmark -› Delete Selected ( Bookmarked ) Record -› GotoBookmark และฉันพบข้อผิดพลาด: ไม่พบบันทึก ฉันมีตารางที่ควรรีเฟรชในแต่ละวินาทีและฉันต้องการให้ผู้ใช้ scrolling ในสถานการณ์นี้ฉันคิดว่าฉันควรใช้ RecNo ฉันลอง RecNo และทำงานได้ดี - person G3ntle_Man; 04.10.2015

person    schedule
comment
ฉันเห็นว่าสิ่งนี้มี -1 อยู่แล้ว ดังนั้นฉันจะไม่เพิ่มของฉัน เหตุผลของ -1 อาจเป็นเพราะว่าลูกหลานของ TDataSet ไม่ใช่ทั้งหมดที่ใช้ RecNo อย่างมีประโยชน์หรือในบางกรณีเลย ดังนั้นจึงไม่มีประโยชน์ในการตอบคำถามของ Op ฉันเกรงว่า - person MartynA; 27.07.2014
comment
@MartynA: GetBookmark อาศัยวิธีการป้องกันเพื่อรับค่าบุ๊กมาร์ก ผู้สืบทอดของ TDataSet ใช้วิธีนี้เพื่อให้การสนับสนุนบุ๊กมาร์กประเภทของตนเอง ชุดข้อมูลทิศทางเดียวไม่รองรับบุ๊กมาร์ก ดังนั้นจึงไม่ส่งคืนค่าที่มีความหมาย - person G3ntle_Man; 02.10.2015
comment
@ Mahmood_M: ฉันไม่แน่ใจว่าทำไมคุณถึงพูดถึงฉัน ชุดข้อมูลแบบทิศทางเดียวอาจไม่รองรับบุ๊กมาร์ก แต่ด้วยเหตุผลเดียวกับที่ไม่สามารถเชื่อมต่อโดยตรงกับ TDBGrid กล่าวคือ เส้นตารางต้องอาศัยชุดข้อมูลที่สามารถนำทางได้ในทั้งสองทิศทาง ดังนั้น หากต้องการใช้ชุดข้อมูลทิศทางเดียวกับ TDBGrid คุณต้องเชื่อมต่อกริดกับชุดข้อมูล TClientDataset และโหลดข้อมูลจากชุดข้อมูลทิศทางเดียว - person MartynA; 02.10.2015