तो मेरे पास यह डेटाग्रिडव्यू है जो एक बाध्यकारी स्रोत से जुड़ा हुआ है जो अंतर्निहित डेटा तालिका के लिए बाध्यकारी है। समस्या यह है कि मुझे डेटाग्रिडव्यू में पंक्तियों को मैन्युअल रूप से जोड़ने की आवश्यकता है।डेटा बाइंडिंग संकट
यह बाध्य होने पर नहीं किया जा सकता है, इसलिए मुझे डेटाबेसिंग के साथ काम करना है।
यदि मैं अंतर्निहित डेटाटेबल को पंक्तियां जोड़ता हूं, जब डेटाटेबल सहेजा जाता है, तो पंक्तियों को डुप्लिकेट किया जाता है, संभवतः बाध्यकारी स्रोत को किसी प्रतिलिपि को पकड़ लिया जाता है और इसे भी डाला जाता है।
इसे बाध्यकारी स्रोत में जोड़ना जो मैं करने की कोशिश कर रहा हूं लेकिन यह काफी काम नहीं कर रहा है।
मुझे समझाने वास्तव में क्या मेरे सेटअप है दो: 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);
}
मुझे एक समस्या है जो मुझे लगता है कि मूल रूप से वही है। मुझे लगता है कि समग्र समस्या यह है: यूआई में बाध्य डेटाव्यू को गड़बड़ किए बिना डेटाटेबल में बदलाव कैसे करें? –
क्या आपने कभी इस पर एक प्रस्ताव प्राप्त किया था? –