2010-02-15 17 views
7

तो मेरे पास यह डेटाग्रिडव्यू है जो एक बाध्यकारी स्रोत से जुड़ा हुआ है जो अंतर्निहित डेटा तालिका के लिए बाध्यकारी है। समस्या यह है कि मुझे डेटाग्रिडव्यू में पंक्तियों को मैन्युअल रूप से जोड़ने की आवश्यकता है।डेटा बाइंडिंग संकट

यह बाध्य होने पर नहीं किया जा सकता है, इसलिए मुझे डेटाबेसिंग के साथ काम करना है।

यदि मैं अंतर्निहित डेटाटेबल को पंक्तियां जोड़ता हूं, जब डेटाटेबल सहेजा जाता है, तो पंक्तियों को डुप्लिकेट किया जाता है, संभवतः बाध्यकारी स्रोत को किसी प्रतिलिपि को पकड़ लिया जाता है और इसे भी डाला जाता है।

इसे बाध्यकारी स्रोत में जोड़ना जो मैं करने की कोशिश कर रहा हूं लेकिन यह काफी काम नहीं कर रहा है।

मुझे समझाने वास्तव में क्या मेरे सेटअप है दो: CashReceiptTable और CashReceiptItemsTable

CashReceiptItemsTable CashReceiptTable करने के लिए एक FK शामिल हैं:

मैं दो तालिकाओं के साथ एक डेटाबेस है।

फ़ॉर्म उपयोगकर्ताओं को दो तालिकाओं को जोड़ने और संशोधित करने की अनुमति देता है।

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

यहाँ समस्याएं हैं:

जब मैं बाध्यकारी स्रोत cashreceiteitems में एक से अधिक पंक्ति में CashReceiptID (FK) अद्यतन करने के लिए प्रयास करते हैं, पहली पंक्ति अद्यतन किया जाता है, और गायब हो जाता (क्योंकि यह फ़िल्टर किया है), और अन्य पंक्तियां हटा दी जाती हैं, और अब मैं उन्हें एक्सेस नहीं कर सकता।

मुझे नहीं पता कि यह क्यों है, मैंने फ़िल्टर को अभी तक अपडेट नहीं किया है, इसलिए उन्हें अभी भी वहां होना चाहिए, लेकिन उन्हें एक्सेस करने का प्रयास RowNotInTableException को फेंकता है।

मैंने एक काम को प्रबंधित किया है जो बाध्यकारी स्रोत में पंक्तियों को स्मृति सरणी में प्रतिलिपि बनाता है, बाध्यकारी स्रोत में पहली पंक्ति को हटा देता है (अन्य सभी पंक्तियां गायब हो जाती हैं), पंक्ति के एफके को अपडेट करें और उन्हें दोबारा डालें बाध्यकारी स्रोत में और तालिका को बचाओ।

यह ठीक काम करता है, लेकिन पंक्तियां गायब क्यों होती हैं?

मुझे भी एक और मामूली समस्या है। जब CashReceiptsTable खाली होता है और मैं इसमें एक नई पंक्ति जोड़ रहा हूं, यदि मैं CashReceiptsItemTable में एक से अधिक पंक्ति जोड़ता हूं तो यह समस्याएं पैदा करता है। मैन्युअल रूप से बाध्यकारी स्रोत में आइटम जोड़ते समय, एक नई पंक्ति जोड़कर पिछली पंक्ति पर पॉप हो जाती है और इसे डेटाटेबल पर धक्का देती है। यह इसे मेरे एफके अद्यतन दिनचर्या से छुपाता है और यह खो जाता है, यह इसे DataGridView से भी हटा देता है।

यह केवल करता है कि जब मैं CashReceiptsTable में पहली पंक्ति जोड़ रहा हूं। ऐसा क्यों करता है, और मैं इसे कैसे ठीक कर सकता हूं?

मैं अपने कोड है कि यह यहाँ autopopulates पोस्टिंग कर रहा हूँ:

 private void autopopulate(decimal totalPayment) { 
      //remove old rows 
      for (int i = 0; i < tblCashReceiptsApplyToBindingSource.List.Count; i++) { 
       DataRowView viewRow = tblCashReceiptsApplyToBindingSource.List[i] as DataRowView; 
       RentalEaseDataSet.tblCashReceiptsApplyToRow row = viewRow.Row as RentalEaseDataSet.tblCashReceiptsApplyToRow; 

       if (row.CashReceiptsID == this.ReceiptID) { 
        tblCashReceiptsApplyToBindingSource.List.Remove(viewRow); 
        i--; 
       } 
      } 

      decimal payment = totalPayment; 

      //look for an exact amount 
      foreach (DataGridViewRow dueRow in dataViewDueRO.Rows) { 
       decimal due = -1 * (Decimal)dueRow.Cells[Due.Index].Value; 
       if (due == payment) { 
        String charge = (String)dueRow.Cells[Description.Index].Value; 
        int chargeID = ManageCheckbooks.findTransactionID(charge); 

        tblCashReceiptsApplyToBindingSource.AddNew(); 

        RentalEaseDataSet.tblCashReceiptsApplyToRow row = ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row as RentalEaseDataSet.tblCashReceiptsApplyToRow; 
        row.CashReceiptsID = this.ReceiptID; 
        row.ApplyTo = chargeID; 

        row.Paid = payment; //convert to positive 

        payment = 0; 
        break; 
       } 
      } 

      //if the exact amount was found, payment will = 0, and this will do nothing, otherwise, 
      //divy out everything left over (which will be everything) 
      foreach (DataGridViewRow dueRow in dataViewDueRO.Rows) { 
       String charge = (String)dueRow.Cells[Description.Index].Value; 
       decimal due = (Decimal)dueRow.Cells[Due.Index].Value; 

       if (due > 0 || payment <= 0) { 
        continue; 
       } 

       int chargeID = ManageCheckbooks.findTransactionID(charge); 

       payment += due; //due is negative, so this will subtract how much the user owes 

       tblCashReceiptsApplyToBindingSource.AddNew(); 

       RentalEaseDataSet.tblCashReceiptsApplyToRow row = ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row as RentalEaseDataSet.tblCashReceiptsApplyToRow; 
       row.CashReceiptsID = this.ReceiptID; 
       row.ApplyTo = chargeID; 

       if (payment >= 0) { 
        //payment is enough to cover this 
        row.Paid = due * -1; //convert to positive 
       } else { 
        //doesn't have enough money to conver this, can only cover partial, or none 
        row.Paid = (due - payment) * -1; //math: 
        //money remaining $50, current charge = $60 
        //payment = 50 + -60 = -10 
        //row["Paid"] = (-60 - -10) * -1 
        //row["Paid"] = (-60 + 10) * -1 
        //row["Paid"] = -50 * -1 
        //row["Paid"] = 50 
       } 

       if (payment <= 0) { 
        break; //don't conintue, no more money to distribute 
       } 
      } 

      isVirginRow = true; 
     } 

और इस समारोह है कि यह डेटाबेस के लिए बचाता है:

protected override void saveToDatabase() { 
     tblCashReceiptsBindingSource.EndEdit(); 
     isVirginRow = false; 

     RentalEaseDataSet.tblCashReceiptsRow[] rows = rentalEaseDataSet.tblCashReceipts.Select("ID < 0") as RentalEaseDataSet.tblCashReceiptsRow[]; 
     int newID = -1; 
     if (rows.Count() > 0) { 
      tblCashReceiptsTableAdapter.Update(rows[0]); 
      newID = rows[0].ID; 
     } 

     tblCashReceiptsTableAdapter.Update(rentalEaseDataSet.tblCashReceipts); 


     //update table 
     /*foreach (RentalEaseDataSet.tblCashReceiptsApplyToRow row in rentalEaseDataSet.tblCashReceiptsApplyTo.Select("CashReceiptsID = -1")) { 
      row.CashReceiptsID = newID; 
     }*/ 

     //update binding source 
     DataRowView[] applicationsOld = new DataRowView[tblCashReceiptsApplyToBindingSource.List.Count]; 
     RentalEaseDataSet.tblCashReceiptsApplyToRow[] applicationsNew = new RentalEaseDataSet.tblCashReceiptsApplyToRow[tblCashReceiptsApplyToBindingSource.List.Count]; 
     tblCashReceiptsApplyToBindingSource.List.CopyTo(applicationsOld, 0); 
     for (int i = 0; i < applicationsOld.Count(); i++) { 
      RentalEaseDataSet.tblCashReceiptsApplyToRow row = applicationsOld[i].Row as RentalEaseDataSet.tblCashReceiptsApplyToRow; 

      if (row.CashReceiptsID < 0) { 
       applicationsNew[i] = rentalEaseDataSet.tblCashReceiptsApplyTo.NewRow() as RentalEaseDataSet.tblCashReceiptsApplyToRow; 
       applicationsNew[i]["ID"] = row.ID; 
       applicationsNew[i]["CashReceiptsID"] = this.ReceiptID; 
       applicationsNew[i][2] = row[2]; 
       applicationsNew[i][3] = row[3]; 
       applicationsNew[i][4] = row[4]; 
       //row.Delete(); 
      } 
     } 
     for (int i = 0; i < applicationsOld.Count(); i++) { 
      try { 
       if ((int)applicationsOld[i].Row["ID"] < 0) { 
        applicationsOld[i].Row.Delete(); 
       } 
      } catch (RowNotInTableException) { 
       break; 
      } 
     } 
     this.tblCashReceiptsApplyToBindingSource.Filter = "CashReceiptsID = " + this.ReceiptID; 

     foreach (DataRow newRow in applicationsNew) { 
      if (newRow == null) { 
       break; 
      } 
      tblCashReceiptsApplyToBindingSource.AddNew(); 
      ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row[0] = newRow[0]; 
      ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row[1] = newRow[1]; 
      ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row[2] = newRow[2]; 
      ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row[3] = newRow[3]; 
      ((DataRowView)tblCashReceiptsApplyToBindingSource.Current).Row[4] = newRow[4]; 
     } 

     tblCashReceiptsApplyToBindingSource.EndEdit(); 

     checkForBadRows(); 

     tblCashReceiptsApplyToTableAdapter.Update(rentalEaseDataSet.tblCashReceiptsApplyTo); 
     tblCashReceiptsApplyToTableAdapter.Fill(rentalEaseDataSet.tblCashReceiptsApplyTo); 
    } 
+0

मुझे एक समस्या है जो मुझे लगता है कि मूल रूप से वही है। मुझे लगता है कि समग्र समस्या यह है: यूआई में बाध्य डेटाव्यू को गड़बड़ किए बिना डेटाटेबल में बदलाव कैसे करें? –

+0

क्या आपने कभी इस पर एक प्रस्ताव प्राप्त किया था? –

उत्तर

1

आप के लिए पंक्तियों जोड़ने का प्रयास करना चाहते हो सकता है DataGridView।चूंकि आप इसके लिए बाध्यकारी हैं, DataGridView आपका 'एक्सेस पॉइंट' बन जाता है।

मेरे पास कई एप्लिकेशन हैं जो डेटाग्रिड व्यू से जुड़ते हैं और ज्यादातर परिस्थितियों में जब मैं पंक्ति जोड़ता हूं तो मैं DataGridView के माध्यम से ऐसा करता हूं। इसमें पहले से ही गुण/विधियां/घटनाएं हैं जो आपको सापेक्ष आसानी से जोड़ने देती हैं।

यदि आपको कुछ और जानकारी चाहिए तो मैं अपडेट कर सकता हूं।

+0

मैं इस सवाल में बताता हूं कि यदि मैं डेटाग्रिड व्यू में पंक्तियां जोड़ता हूं, तो यह उन्हें डेटाबेस में डुप्लिकेट करता है। मैंने इसे पोस्ट करने के एक दिन बाद इस मुद्दे को ठीक किया, लेकिन मुझे याद नहीं आया कि फिक्स क्या था। – Malfist

+0

मैं देखता हूं कि "मैं अंतर्निहित डेटाटेबल को पंक्तियां जोड़ता हूं, जब डेटाटेबल सहेजा जाता है, पंक्तियां डुप्लिकेट की जाती हैं"। मैंने डेटाग्रिडव्यू और डुप्लिकेटिंग के बारे में बात करने में कुछ भी नहीं देखा, लेकिन मैं इसे याद कर सकता था। –

+0

मैं अपने पास एक और समस्या के बारे में सोच रहा होगा। क्षमा करें, मेरे कोड के माध्यम से जा रहा है, मैंने पाया कि मैंने डेटाग्रिडव्यू में एक पंक्ति जोड़ने के लिए डेटा को डेटासेट में जोड़ने से बदल दिया है, इसलिए मैंने आपकी सलाह लेनी होगी। 'ViewApplications.Rows.Add (नई वस्तु [] { -1, this.ReceiptID, chargeID, String.Format (" $ {0: एन} ", paidThisTime), " " });' – Malfist

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