2008-10-31 3 views
45

जब आप आधार डेटा स्रोत अद्यतन एक DataGridView ताज़ा करने के लिए सबसे अच्छा तरीका क्या है अद्यतन?सबसे अच्छा तरीका है DataGridView ताज़ा करने के लिए जब आप आधार डेटा स्रोत

मैं अक्सर डेटा स्रोत को अद्यतन करने कर रहा हूँ और उपयोगकर्ता के लिए परिणाम प्रदर्शित करने के लिए के रूप में यह होता है चाहता था।

मैं इस बनाया की तरह कुछ मिल गया है (और यह काम करता है), लेकिन DataGridView.DataSource बाहर null'ing सही तरीके से की तरह प्रतीत नहीं होता।

List<ItemState> itemStates = new List<ItemState>(); 
dataGridView1.DataSource = itemStates; 

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
} 

उत्तर

44

खैर, यह है कि तुलना में काफी बेहतर नहीं मिलता है। आधिकारिक तौर पर, आप

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates; 

यह अभी भी एक "स्पष्ट/रीसेट स्रोत" समाधान की तरह का उपयोग करना चाहिए, लेकिन मैं अभी तक कुछ और है कि मज़बूती से DGV डेटा स्रोत ताज़ा हैं खोजने के लिए।

+0

इस तरह से मैं इसे लंबे समय से कर रहा हूं और ऐसा लगता है कि यह सबसे अच्छा काम करता है। यह आपके सभी डेटा बाध्य नियंत्रणों को जांचने के लिए जांचता है कि क्या उनके डेटा को अपडेट किया गया है और फिर आवश्यक होने पर रीफ्रेश करें। –

+0

चीयर्स । कि सत्यापित करने के लिए मैं उम्मीद कर रही थी तुम सिर्फ डेटा स्रोत को बदल सकता है तो किसी तरह की एक ताज़ा करते हैं:। पी यह सिर्फ एक तार्किक समाधान तरह लग रहा था ओह अच्छी तरह से – shaunf

+0

क्या का उपयोग करने का महत्व 'typeof (सूची)' है बजाय। शून्य? – GWLlosa

-5

इस संहिता का प्रयास करें

List itemStates = new List(); 

for (int i = 0; i < 10; i++) 
{ 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = itemStates; 
    dataGridView1.DataBind(); 
    System.Threading.Thread.Sleep(500); 
} 
+3

डेटाबिंड() डाटाबेस नियंत्रण के लिए एक एएसपी .NET विधि है। – Tjaart

+2

+ 'थ्रेड। सो जाओ '!!! = ( – Coops

38

मैं अपने आप को इस में भाग गया। मेरी सिफारिश: यदि आपके पास डेटास्रोत का स्वामित्व है, तो List का उपयोग न करें। BindingList का उपयोग करें। BindingList घटनाओं कि आग जब आइटम जोड़ा या परिवर्तित किया जाता है, और DataGridView स्वचालित रूप से अपडेट हो जाएगा जब इन घटनाओं निकाल दिया जाता है।

+4

यह एक अच्छा सुझाव है। उसके बाद आपको बस डेटा को रीफ्रेश करने के लिए डेटाग्रिडव्यू के लिए .efreshresh() को कॉल करना होगा ... – veljkoz

+2

पंक्ति का उपयोग करके पंक्ति को ताज़ा कर सकते हैं: bindingList.ResetItem (बाइंडिंगलिस्ट। इंडेक्सऑफ (आइटम)); –

+2

'। रिफ्रेश() 'केवल नियंत्रण को पुनर्निर्मित करने के बारे में बात करता है, बाइंडिंग के साथ कुछ भी नहीं करना जब तक कि मैं बहुत गलत नहीं हूं! "अपने ग्राहक क्षेत्र को अमान्य करने के लिए नियंत्रण को मजबूर करता है और तुरंत खुद को और किसी भी बच्चे के नियंत्रण को दोबारा हटा देता है।" [नियंत्रण। रीफ्रेश विधि] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx) – Coops

0

यह THIS जगह से मेरा उत्तर नकल है।

केवल इस तरह फिर से datagrid भरने की जरूरत है:

this.XXXTableAdapter.Fill(this.DataSet.XXX); 

आप को घटा देती का उपयोग करते हैं DataGridView से कनेक्ट इस कोड Form_Load()

2

ObservableCollection में घटा देती बनाने के लिए: एक गतिशील डेटा संग्रह प्रदान करता है कि प्रतिनिधित्व करता है नोटिफिकेशन जब आइटम जोड़े जाते हैं, हटाए जाते हैं, या जब पूरी सूची रीफ्रेश हो जाती है। आप किसी भी संग्रह है कि IEnumerable इंटरफ़ेस लागू करता है से अधिक की गणना कर सकते हैं। हालांकि, ताकि सम्मिलन या संग्रह में विलोपन यूआई अद्यतन स्वचालित रूप से, संग्रह INotifyCollectionChanged इंटरफ़ेस को लागू करना चाहिए गतिशील बाइंडिंग स्थापित करने के लिए। यह इंटरफ़ेस CollectionChanged घटना, एक घटना है कि उठाया जाना चाहिए जब भी अंतर्निहित संग्रह परिवर्तन उजागर करता है।

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>(); 

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    } 
dataGridView1.DataSource = itemStates; 
-1

आप लूप के अंदर डेटा स्रोत की स्थापना और 500 सो प्रत्येक जोड़े जाने के बाद कर रहे हैं। क्यों न केवल आइटमस्टेट में जोड़ें और फिर अपने डेटासोर्स को सेट करें, इसके बाद आपने सब कुछ जोड़ा है। यदि आप उस जुर्माना के बाद थ्रेड सोना चाहते हैं। यहां कोड का पहला ब्लॉक आपका दूसरा ब्लॉक है जिसे मैंने संशोधित किया है।

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
} 

बदलें अपने कोड के रूप में इस प्रकार है: इस तेज हो गया है।

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 

} 
    dataGridView1.DataSource = typeof(List); 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
2

साफ, सबसे अधिक कुशल और प्रतिमान के अनुकूल है इस मामले में समाधान अपने आइटमों की सूची (डेटा स्रोत) और अपने DataGridView बीच प्रॉक्सी की तरह एक System.Windows.Forms.BindingSource उपयोग करने के लिए है: तो फिर

var itemStates = new List<ItemState>(); 
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates }; 
dataGridView1.DataSource = bindingSource1; 

, जब

for (var i = 0; i < 10; i++) 
{ 
    bindingSource1.Add(new ItemState { Id = i.ToString() }); 
    System.Threading.Thread.Sleep(500); 
} 

थी: जोड़ने आइटम, अपनी सूची के Add() विधि के बजाय BindingSource की Add() विधि का उपयोग कोड की एक ही पंक्ति के साथ उन जोड़ों के बारे में DataGridView को आपकी सूची में आइटम जोड़ने और आपको सूचित करने का तरीका। हर बार जब आप सूची में बदलाव करते हैं तो DataGridView के DataSource को रीसेट करने की आवश्यकता नहीं है।

यह भी उल्लेख है कि आप एक BindingSource आपके प्रपत्र पर सीधे दृश्य स्टूडियो के प्रपत्र डिज़ाइनर में जो आप ऊपर के उदाहरण में कोड की एक पंक्ति की बचत होती है ड्रॉप और साथ ही आपकी DataGridView में डेटा स्रोत के रूप में यह संलग्न कर सकते हैं, के लायक है, जहां मैं मैं इसे मैन्युअल रूप से कर रहा हूँ।

+1

इस उत्तर को सही उत्तर ध्वज प्राप्त होना चाहिए था। मेरा वोट यहां जाता है। – jsa

+0

@jsa: दुर्भाग्यवश, ओपी हेवन 200 9 से SO का दौरा नहीं कर रहा है। –

+1

निश्चित रूप से सबसे अच्छा जवाब - एक दयालुता को इतने सारे उपरांत मिलते हैं, लेकिन तारीखों के आधार पर उन्हें इकट्ठा करने में काफी समय लगता है! – Billious

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^