0

对于每个语句,我需要一些帮助,基本上,当用户编辑单元格中的值时,我的 foreach 会将其应用于数据网格中的所有单元格并更改它们的值,我需要我的 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);
}    
4

1 回答 1

1

首先,我将这里的代码简化一点,将其拆分为几个可以从 For 循环调用的方法。这将使它更容易阅读,从而也更容易帮助你。举个例子,如下:

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()); 
}

可以用类似的东西代替:

int intQtyInsp = SetQuantityInspected();

然后该方法可以包含 if 结构。对循环中代码的其他部分也重复此操作。相信我,这会让你的生活更轻松。

此外,似乎从未使用过本节的结果;的值intQtyInsp随后被覆盖!:

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

至于您的问题:我不确定您将如何获得当前正在编辑的行的 id。(如果可能(?),循环遍历数据网格后面的表/数据源可能是吸气剂?)。

无论如何,您需要在循环中执行以下操作:

if(IsCurrentlyEditedRow(row)){
    ...

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

现在您可以实现IsCurrentlyEditedRow()返回TrueFalse取决于当前行的 id 是否与您正在编辑的行相同的方法。

对不起,如果这不是一个非常具体和详细的​​答案,希望它无论如何都有用。

于 2012-08-23T11:26:22.643 回答