2012-09-19 10 views
6

मैं एंटिटी फ्रेमवर्क (5.0 और वीएसईएक्सप्रेस 2012) सीख रहा हूं और मुझे WinForms में डेटा ग्रिड व्यू में मेरी क्वेरी बाध्य करने में वास्तविक समस्या है। मेरे पास निम्न कोड है और जब मैं एप्लिकेशन शुरू करता हूं तो यह मेरी क्वेरी ठीक से प्रदर्शित करता है लेकिन मुझे नहीं पता कि अंतर्निहित डेटाबेस में डेटा बदलने के बाद डेटा ग्रिडव्यू को अपडेट करने के लिए मुझे क्या करना है। ऐसा करने का सबसे अच्छा तरीका क्या है? मुझसे यहां क्या गलत हो रहा है?डाटाबेसिंग के लिए डेटा बाध्यकारी linq क्वेरी एंटीटी फ्रेमवर्क 5.0

private void Form1_Load(object sender, EventArgs e) 
    { 
     using(var ctx = new TimeKeepEntities()) 
     { 

      var qLoggedIn = from r in ctx.tblTimeRecords 
         where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30 
         select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut }; 

      dataGridView1.DataSource = qLoggedIn.ToList(); 

     } 
    } 

उत्तर

7

फो ध्यान दें कि वे WinForms का उपयोग कर रहे नहीं asp.net। MSDN के अनुसार आप निम्न कर सकते हैं:

BindingSource bindingSource1 = new BindingSource(); 
bindingSource1.DataSource = (from r in ctx.tblTimeRecords 
         where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30 
         select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut }).ToList(); 

dataGridView1.DataSource = bindingSource1; 

देखें: msdn documentation

+3

मैंने यह किया। बाध्यकारी सही था और मैं एक सेव बटन का उपयोग करते समय डेटाग्रिडव्यू से डेटा संपादित करने में सक्षम था: context.SaveChanges()। समस्या यह है कि जब मुझे डेटा की एक नई पंक्ति जोड़नी है या इसे हटा देना है। SaveChanges जब डेटाबेस में उन प्रकार के परिवर्तन डेटाबेस में परिलक्षित नहीं होते हैं। शायद मैं कुछ संपत्ति सेट भूल रहा हूँ ...? ¿ –

+1

मुझे एक ही समस्या @ AlejandrodelRío मिल रही है। अब मैं यह देखने के लिए कि क्या आपने इसे हल किया है, अपने सभी प्रश्नों और उत्तरों को मकड़ी देने जा रहा हूं। मुझे शुभकामनाएँ दें! – Robino

+0

@ रोबिनो मैंने इसका उत्तर नहीं दिया है, लेकिन यह अपमान आपको डेटाग्रिडव्यू से सीधे वस्तुओं को जोड़ने या हटाने में मदद नहीं करेगा। इसके बजाय आपको एक बाइंडिंगलिस्ट <ऑब्जेक्ट टॉशोइनडेटाग्रिड> बनाना है, जहां ऑब्जेक्ट टॉशोइन इनडेटाग्रिड उन ऑब्जेक्ट्स के साथ एक ऑब्जेक्ट है जिन्हें आप दिखाना चाहते हैं और इसमें डेटाबेस इकाई का एक उदाहरण है। आपको सभी "सेट" में अधिसूचनाप्रॉपर्टींग विधि भी जोड़नी होगी। इस तरह परिवर्तन ऑब्जेक्ट और डेटाबेस पर दिखाई देंगे। मैं इसे एक उत्तर में समझाऊंगा। –

0

आप dataGridView1.DataBind(); के साथ डेटा के लिए बाध्य करने के लिए है: कृपया

... 
dataGridView1.DataSource = qLoggedIn.ToList(); 
dataGridView1.DataBind(); 
... 
+0

मुझे नहीं लगता है .टाटाइंड() विधि मेरे इंटेलिजेंस में उपलब्ध है। मैं एंटिटी फ्रेमवर्क 5 का उपयोग कर रहा हूं और शायद वे इसे किसी और चीज़ में बदल दें। – Mr1159pm

+0

मुझे यकीन नहीं है कि आप इसे अपने संपादक में क्यों नहीं देखते हैं, लेकिन मुझे पता है कि इसे डेटासोर्स असाइन करने के बाद बाध्य होना चाहिए :) – pho

+0

बात यह है कि यह ग्रिड व्यू नियंत्रण पर .NET विधि से अधिक है खुद, और इकाई फ्रेमवर्क के साथ कुछ भी नहीं करना है। – pho

0

नेट डिस्कनेक्ट मॉडल का उपयोग करता। जब आप डेटाबेस से जानकारी प्राप्त करते हैं, तो उस समय उस समय एक स्नैपशॉट होता है। यदि आप अंतर्निहित डेटा स्टोर में डेटा बदलते हैं, तो वे परिवर्तन तब तक परिलक्षित नहीं होंगे जब तक आप डेटाबेस को स्पष्ट रूप से पुनः क्वेरी नहीं करते और आपके यूआई को दोबारा नहीं देते।

जब आप अपने यूआई में परिवर्तनों को सहेजते हैं, तो ईएफ यह देखने के लिए जांच सकता है कि क्या किसी और ने उस पंक्ति को बदल दिया है जिसे आप संशोधित कर रहे हैं (समवर्ती चिंताओं के लिए) और यदि आपको कोई संभावित संघर्ष हो तो आपको बताएं।

+1

दिलचस्प पर एक नज़र डालें। क्या आप कुछ उदाहरण पोस्ट कर सकते हैं? यह उपयोगी होगा। –

+0

इस चेक को करने के लिए ईएफ को कैसे प्रोत्साहित किया जाता है? – Robino

0
IEnumerable<DataRow> query =(from p in orginalList.AsEnumerable() 
            where p.Field<long>("Category") == 2 
            select p).ToList(); 
         DataTable boundTable = query.CopyToDataTable<DataRow>(); 

         dataGridView1.AutoGenerateColumns = false; 

         dataGridView1.DataSource = boundTable; 
संबंधित मुद्दे