2012-08-23 113 views
0

我需要一些幫助,一個爲每個語句,基本上發生的事情是,當用戶在小區內編輯的值,我的foreach將在DataGrid中應用此於所有細胞,並改變他們所有的價值,我需要我的foreach語句通過數據網格迭代工作,但只改變已被編輯全部C#foreach語句

try 
{ 
    //loop through each of the rows in the dgv 
    foreach (DataGridViewRow row in dgvDetials.SelectedRows) 
    { 
     int intQtyInsp = 0; 

     //if quantity inspected is empty: 
     if (row.Cells[2].Value.ToString() == "") 
     { 
      //quantity inspected is 0. Prevents null value errors: 
      intQtyInsp = 0; 
     } 

     intQtyInsp = 
      Int32.Parse(dgvDetials.CurrentRow.Cells[2].Value.ToString()); 

     if (intQtyInsp < 0) // checks the cell for a negative value 
     { 
      intQtyInsp = 0; // if cells is negative submits value as Zero 
     } 
     else 
     { 
      //sets quantity inspected to value entered 
      intQtyInsp = Int32.Parse(row.Cells[2].Value.ToString()); 
     } 

     if (intQtyInsp == 0) //if quantity inspected is 0. Ignore row. 
     { 

     } 
     else //else gather details and insert row as production. 
     { 
      area = dtArea2.Rows[0]["area_code"].ToString(); 
      inspDate = dtpInspectionDate.Value.ToString("MM/dd/yyyy"); 
      inspShift = cbShift.Text; 
      partNo = row.Cells[0].Value.ToString(); 
      // dieCode = row.Cells[0].Value.ToString(); 
      dieCode = ""; 
      machine = ""; 
      qtyInsp = intQtyInsp; 
      qtyInspRecorded = Int32.Parse(row.Cells[5].Value.ToString()); 
      comment = ""; 
      //machine = row.Cells[3].Value.ToString(); 

      if (qtyInspRecorded == 0) 
      { 
       SQLMethods.insertProduction(area, 
              inspDate, 
              inspShift, 
              partNo, 
              dieCode, 
              qtyInsp, 
              comment, 
              machine); 
      } 
      else 
      { 
       SQLMethods.updateProduction(area, 
              inspDate, 
              inspShift, 
              partNo, 
              dieCode, 
              (qtyInspRecorded + qtyInsp), 
              comment, 
              machine); 
      } 
     } 
    } 
    retrieveData(); //reset values 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(
     "Error instering production values. Processed with error: " 
     + ex.Message); 
}  
+2

這是一個很大的代碼,並沒有問題。你發佈的代碼有什麼問題? –

+0

不能看到任何錯誤 – Asken

+0

使用'Linq'只得到這一行,你需要改變。人的問題是如何只更新1更改的行不是所有'DataGrid' – harry180

回答

1

首先選定行,我會被拆分爲幾種方法可稱爲此處略簡化代碼從For循環。這會讓閱讀更容易,從而也更容易幫助你。只需提供一個例子,以下內容:

int intQtyInsp = SetQuantityInspected(); 

然後該方法可以包含如結構:

if (intQtyInsp < 0) // checks the cell for a negative value 
{ 
    intQtyInsp = 0; // if cells is negative submits value as Zero 
} 
else 
{ 
    //sets quantity inspected to value entered 
    intQtyInsp = Int32.Parse(row.Cells[2].Value.ToString()); 
} 

可能喜歡的東西來代替。對循環中代碼的其他部分重複此操作。相信我,這會讓你的生活更輕鬆。

而且,它好像是從來沒有使用過這部分的結果;的intQtyInsp值覆蓋右後!:

if (row.Cells[2].Value.ToString() == "") 
{ 
    //quantity inspected is 0. Prevents null value errors: 
    intQtyInsp = 0; 
} 

至於你的問題:我不知道你將如何獲得當前正在編輯的行的id。 (如果可能(?),它可能是getter循環訪問datagrid後面的表/數據源?)。

在任何情況下,你需要做的是一樣的東西你的循環內的以下內容:

if(IsCurrentlyEditedRow(row)){ 
    ... 

    // (all the stuff currently in the body of your loop goes here) 
    ... 
} 

現在,您可以實現該方法IsCurrentlyEditedRow()返回TrueFalse根據的的ID是否當前行與您正在編輯的行相同。

很抱歉,如果這不是一個非常具體和詳細的​​解答,希望這是一些使用的反正。

+1

看到它周圍編輯當前行的第一次,當我輸入了第一時間的值,但它是當我重新編輯同一行,當所有行更新 –