ผูกพจนานุกรมกับ DataGridView ด้วยการอัปเดตบ่อยครั้ง

ฉันมี Dictionary (Of long, Class) คลาสมีคุณสมบัติหลายอย่าง และฉันต้องการดูข้อมูลของพจนานุกรมนี้ใน DataGridView ดังนั้นฉันจึงใช้:

DataGridView1.DataSource = Dictionary.Values.ToArray

ขณะนี้ คุณสมบัติภายในออบเจ็กต์คลาสสำหรับบันทึกภายในพจนานุกรมกำลังอัปเดตอย่างต่อเนื่อง (บ่อยเกินไป) และฉันต้องการสะท้อนการอัปเดตเหล่านี้ไปยัง DataGridView โดยตรง

ฉันเชื่อว่าการใช้ DataGridView1.DataSource = Dictionary.Values.ToArray ทุกครั้งไม่ใช่วิธีที่มีประสิทธิภาพและจะใช้พลังการประมวลผลมาก ฉันจะทำให้ Dictionary Bindable ได้อย่างไร (เช่นใน DataTables เป็นต้น) ฉันต้องการสิ่งนี้ใน VB.NET ฉันพยายามใช้ Linq เพื่อแก้ไขปัญหานี้ (พบได้ที่นี่ https://stackoverflow.com/a/855954/2546348) แต่ถึงกระนั้น ฉันก็ยังไม่เห็นการอัปเดตใหม่ที่จะมาใน DataGridView

มีข้อเสนอแนะอะไรบ้าง? อะไรจะเป็นแนวทางที่ดีที่สุดในการดำเนินการนี้?


person Ahmad Musa    schedule 11.11.2019    source แหล่งที่มา
comment
คุณใช้อะไร WPF หรือ WinForms?   -  person Pavel Anikhouski    schedule 11.11.2019
comment
ขออภัยไม่ได้กล่าวถึงสิ่งนั้นในโพสต์ WinForms   -  person Ahmad Musa    schedule 11.11.2019
comment
วัตถุคลาสของคุณควรใช้ INotifyPropertyChanged เมื่อเสร็จแล้ว คุณสามารถผูก [Dictionary].Values ของคุณกับ BindingSource จากนั้นผูก DGV กับ BindingSource (ตั้งค่า .DataSource = [TheBindingSource] ของ DGV) การเปลี่ยนแปลงค่าพจนานุกรมจะมีผลใน DGV ทันที   -  person Jimi    schedule 11.11.2019
comment
ขอบคุณ @Jimi โซลูชันของคุณใช้งานได้อย่างมีเสน่ห์ มีคำถามอีกข้อหนึ่งเข้ามาในใจฉัน ตอนนี้จะทำสิ่งเดียวกันได้อย่างไร แต่เมื่อรายการใหม่ถูกเพิ่มลงในพจนานุกรมหรือถูกลบออกจากรายการ มีการแจ้งเตือนที่คล้ายกันที่สามารถยกขึ้นเพื่อให้แหล่งข้อมูลอัปเดตตามรายการล่าสุด (การเพิ่มเติมและการลบในพจนานุกรม) โดยไม่ต้องกำหนด DataSource สำหรับ DGV อีกครั้งหรือไม่... ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ   -  person Ahmad Musa    schedule 12.11.2019
comment
ไม่ใช่โดยตรง. แม้ว่า ValueCollection ที่เปิดเผยโดย [Dictionary].Values จะไม่คงที่ (การอ้างอิง ValueCollection พื้นฐานจะได้รับการอัปเดตเมื่อคุณเพิ่ม/ลบไปยัง/จากพจนานุกรม) แต่ก็ไม่ทำให้เกิดการแจ้งเตือนการเปลี่ยนแปลงรายการ (จริงๆ แล้วมีวิธีต่างๆ แต่ฉันจะไม่ แนะนำใด ๆ :) คุณสามารถ: 1) เพิ่มรายการใหม่ลงใน BindingSource (วัตถุ TValue พร้อมด้วย BindingSource.Add([object])) ซิงค์พจนานุกรมเมื่อจำเป็น 2) สร้างคลาสของคุณเองที่สืบทอดมาจาก Dictionary‹TKey, TValue› และใช้อินเทอร์เฟซ IBindingList 3) ใช้ DataTable แทนพจนานุกรม   -  person Jimi    schedule 12.11.2019
comment
ในจุดที่ 2) การใช้งานแบบกำหนดเองสามารถให้การตอบสนองเริ่มต้นในกรณีปกติ โดยใช้วิธีเริ่มต้นของการใช้งาน Dictionary<TKey, TValue> แต่จัดเตรียม ValueCollection ในรูปแบบของตัวเองเมื่อผูกกับข้อมูล ผ่านวิธีการ IBindingList และ รายการที่เข้าใจกันทั่วไป/ตีความการเปลี่ยนแปลงการแจ้งเตือน   -  person Jimi    schedule 12.11.2019
comment
ขอบคุณอีกครั้ง @จิมิ เมื่อคุณพูด (ฉันจะไม่แนะนำใด ๆ ) คุณหมายถึงว่าฉันสามารถใช้วิธีใดวิธีหนึ่งได้หรือไม่? หรือคุณไม่ต้องการใช้สิ่งใดๆ เนื่องจากปัญหา/ข้อเสียที่ทราบบางประการเมื่อใช้งาน ฉันคิดว่าโซลูชันที่ 1 อาจจะง่ายที่สุด แต่จะสนใจดูตัวอย่างข้อเสนอแนะ (2) ถ้ามีและไม่รังเกียจ ดีที่สุด :)   -  person Ahmad Musa    schedule 13.11.2019
comment
และ BTW @จิมิ ฉันขอแนะนำให้คุณใส่ความคิดเห็นแรกของคุณเป็นคำตอบเพื่อโหวตให้เป็นคำตอบที่ถูกต้องเนื่องจากช่วยฉันในปัญหาแรกของฉันในโพสต์ ...   -  person Ahmad Musa    schedule 13.11.2019


คำตอบ (1)


ขอบคุณความคิดเห็นของ @ jimi ฉันใช้คุณสมบัติ notify เพื่อให้บรรลุเป้าหมายนี้... แต่ฉันจำเป็นต้องตอบคำถามนี้:

วัตถุคลาสของคุณควรใช้ INotifyPropertyChanged เมื่อเสร็จแล้ว คุณสามารถผูก [Dictionary].Values ของคุณกับ BindingSource จากนั้นผูก DGV กับ BindingSource (ตั้งค่า .DataSource = [TheBindingSource] ของ DGV) การเปลี่ยนแปลงค่าพจนานุกรมจะมีผลใน DGV ทันที

person Ahmad Musa    schedule 04.04.2020