Soru İki ekranımdan birinde DataGridView'ın korkunç yeniden çizme performansı
Bunu gerçekten çözdüm, ama onu posterciliğe gönderiyorum.
Çift monitör sistemimde DataGridView ile çok garip bir sorun yaşadım. Sorun, kontrolün son derece yavaş bir yeniden boyaması olarak kendini gösteriyor.tam bir rötuş için 30 saniye gibi), ancak sadece ekranlarımdan birinde olduğunda. Diğer tarafta, rötuş hızı iyi.
En yeni beta olmayan sürücülerle (175. bir şey) Nvidia 8800 GT'm var. Sürücü hatası mı? Bu özel konfigürasyonla yaşamak zorunda olduğum için bunu havada bırakacağım. (ATI kartlarında olmasa da ...)
Boya hızının hücre içeriği ile hiçbir ilgisi yoktur ve özel çizim, sadece bir katı dikdörtgeni boyadığında bile performansı iyileştirmez.
Daha sonra formda bir ElementHost (System.Windows.Forms.Integration ad alanı) yerleştirme sorunu düzeltir buluyorum. Bununla uğraşmak zorunda değil; Sadece DataGridView'ın da olduğu formdaki bir çocuğun olması gerekiyor. Bu sürece (0, 0) için yeniden boyutlandırılabilir Gözle görülür özellik doğrudur.
.NET 3 / 3.5 bağımlılığını uygulamanıza açıkça eklemek istemiyorum; Yansıma kullanarak çalışma zamanında (eğer yapabilirse) bu denetimi oluşturmak için bir yöntem yapıyorum. İşe yarıyor ve en azından gerekli kütüphaneye sahip olmayan makinelerde incelikle başarısız oluyor - bu sadece yavaş olmaya geri dönüyor.
Bu yöntem aynı zamanda uygulama çalışırken düzeltmek için başvurmamı sağlar, WPF kitaplıklarının formumda (Spy ++ kullanarak) neler değiştiğini görmeyi kolaylaştırır.
Çok fazla deneme ve hatadan sonra, kontrolün kendisinde (sadece formun tersine) çift arabelleğe almanın problemi düzelttiğini fark ettim!
Dolayısıyla, sadece DoubleGuffering'i etkinleştirebilmeniz için DataGridView'a dayalı özel bir sınıf oluşturmanız gerekir. Bu kadar!
Kılavuzun tüm örnekleri bu özel sürümü kullandığı sürece, her şey yolunda. Eğer alt sınıf çözümünü kullanamadığım bir durumla karşılaşırsam (eğer kodum yoksa), bu kontrolü forma enjekte etmeyi deneyebilirim :) (DoubleBuffered özelliğini dışarıdan bir kez daha zorlamak için yansımayı kullanmayı denemeye daha yatkın olmasına rağmen bağımlılığı önlemek).
Bu kadar basit ve basit bir şeyin zamanımın çoğunu yemesi çok üzücü ...
Müşterilerimizle benzer bir sorun yaşadık multimon Kurulmuş. Hangi nedenle olursa olsun, Multimon'u kapattığında, sorun gider. - BlueRaja - Danny Pflughoeft
Sadece DoubleGuffering'i etkinleştirebilmeniz için DataGridView'a dayalı özel bir sınıf oluşturmanız gerekir. Bu kadar!
Kılavuzun tüm örnekleri bu özel sürümü kullandığı sürece, her şey yolunda. Eğer alt sınıf çözümünü kullanamadığım bir durumla karşılaşırsam (eğer kodum yoksa), bu kontrolü forma enjekte etmeyi deneyebilirim :) (yine de DoubleBuffered özelliğini dışarıdan bir kez daha bağımlılıktan kaçınmaya zorlamak için yansıma kullanmayı denemesi daha olasıdır).
Not: Cevabı bir cevap olarak vermek, böylece soru cevap olarak işaretlenebilir
WPF için Windows Forms Entegrasyonu ile bunu nasıl yapabilirsiniz? - Partial
Cevap için teşekkürler. Alt sınıf çözümünü bazen nasıl kullanamazsınız? ("Kodu yoksa" diye anlayamadım). - Dan W
Fantastik! Projemde hem masanın üzerinde hem de masanın üzerinde duran garip yavaşlamadan kaynaklanan çekicilik gibi çalışıyor (: - knut
Burada, Benoit'in öne sürdüğü gibi, alt sınıflandırma yapılmadan yansımayı kullanarak mülkiyeti belirleyen bazı kodlar var.
Yardım ettiğim için sevindim! Neredeyse hiç yayınlamadım çünkü bu soru zaten bir yaşındaydı. - Brian Ensink
Neah, gelecekte her zaman, belki de bu konuyu Google'dan alan, belki de ben gibi birilerine yardımcı olacaktır. Teşekkürler! Btw, bunu Form1_Load bölümüne koymak tercih edilir mi? - Dan W
Sadece bu fikri anlayan başka birine vermek için: Bu yararlı bir uzantı yöntemidir. Control sınıf. public static void ToggleDoubleBuffered(this Control control, bool isDoubleBuffered). - Anthony
VB.NET'te nasıl yapılacağını araştıran kişiler için kod aşağıdadır:
Windows Forms uygulamaları için önceki yayınlara eklediğimizde, bunları hızlı hale getirmek için DataGridView bileşenleri için kullanıyorum. DrawingControl sınıfının kodu aşağıdadır.
Yapıcıdaki InitializeComponent () öğesinden sonra DrawingControl.SetDoubleBuffered (denetim) arayın.
Büyük veri güncellemeleri yapmadan önce DrawingControl.SuspendDrawing (kontrol) çağırın.
Büyük veri güncellemeleri yaptıktan sonra DrawingControl.ResumeDrawing (kontrol) çağırın.
Bu son 2 en iyi bir deneme / sonuncu blok ile yapılır. (veya sınıfı daha iyi yeniden yaz IDisposable ve Çağrı yap SuspendDrawing() kurucu ve ResumeDrawing() içinde Dispose().)
Bunun cevabı benim için de işe yaradı. Çözümü uygulayan herkes için standart bir uygulama olması gerektiğini düşündüğüm bir ayrıntı ekleyeceğimi düşündüm.
Çözüm, UI'nin, özellikle mevcut ağ bant genişliğinin düşük olduğu durumlarda, uzak masaüstünde bir istemci oturumu olarak çalıştırılması dışında iyi çalışır. Böyle bir durumda, çift arabelleğin kullanımıyla performans daha da kötüleştirilebilir. Bu nedenle, aşağıdakileri daha eksiksiz bir yanıt olarak öneririm:
Daha fazla bilgi için bkz. Uzak masaüstü bağlantısının algılanması
Soruna bir çözüm buldum. Gelişmiş görüntü özelliklerinde sorun giderme sekmesine gidin ve donanım hızlandırma kaydırıcısını kontrol edin. Yeni şirket bilgisayarımı BT'den aldığımda, tam olarak bir kene olarak ayarlandı ve datagrids ile ilgili herhangi bir sorun yaşamadım. Bir kez ekran kartı sürücüsünü güncelledim ve tam olarak ayarladıktan sonra, datagrid kontrollerinin boyaması çok yavaşladı. Böylece, bulunduğu yere geri sıfırladım ve sorun ortadan kalktı.
Umarım bu hile de sizin için çalışır.
Sadece bu sorunu çözmek için yaptığımız şeyi eklemek için: En son Nvidia sürücülerine güncelledik, sorunu çözdük. Hiçbir kodun yeniden yazılması gerekmedi.
Tamlık için, kart Mart 2008 tarihli (v. 169) sürücülere sahip bir Nvidia Quadro NVS 290 idi. En son sürüme (v. 182 Şubat 2009 tarihli) yükseltmek, tüm denetimlerim için özellikle de DataGridView için boya olaylarını önemli ölçüde geliştirdi.
Bu sorun herhangi bir ATI kartında görülmedi (geliştirmenin gerçekleştiği yer).
Bir çift monitör sisteminde .NET 3.0 ve DataGridView kullanarak benzer bir sorun yaşadık.
Uygulamamız, gri bir arka plan ile ızgarayı gösterecek ve bu da hücrelerin değiştirilemeyeceğini gösteriyor. Bir "ayarları değiştir" düğmesini seçtikten sonra, program, hücre metninin değiştirilebileceğini kullanıcıya göstermek için beyazın arka plan rengini değiştirecektir. Bir "iptal" düğmesi, daha önce bahsedilen hücrelerin arka plan rengini griye değiştirecektir.
Arka plan rengi değiştikçe, aynı sayıda satır ve sütuna sahip bir varsayılan boyutlu ızgaraya kısa bir izlenim olacaktı. Bu sorun sadece birincil monitörde (asla ikincil olmayan) ortaya çıkar ve tek bir monitör sisteminde gerçekleşmez.
Yukarıdaki örneği kullanarak kontrolün iki kez tamponlanması problemimizi çözdü. Yardımınızı çok takdir ediyoruz.
'Object' üzerinde mülkün nasıl geçeceği Tanımlayıcı ve tanımlayıcı olmayan ilişkiler arasındaki fark nedir? Android. GetActivity () parçası bazen null değerini döndürür Listeyi Python'daki bir sözlüğe dönüştürme Madde 4 ve sonrası için nth-child kullanma Lateks içinde QED sembolü SQL Server'da bir tablo nasıl yeniden adlandırılır?