-1

私はこのフォームアプリケーションプロジェクトを持っています。販売現場のスナップをアップします。2 つdatagridviewあります。下部datagirdviewに含まれていますTAX details。底のコンテはdatagridから来ましたdatabase except “Amount” column。ユーザーから提供された、または自動計算された金額列の値。コードを書きます。実行しようとすると、エラーが表示されます。Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index. どうすれば解決できますか??

スナップ::

ここに画像の説明を入力

コードは次のとおりです。

        private void dgvSalesFooterAdd_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
        {
            decimal Total = 0;

            decimal a=Convert.ToDecimal(lblTotalAdd.Text);
            for (int i = 0; i <dgvSalesFooterAdd.Rows.Count ; i++)
            {

                dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

                Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
            }
            lblFinalTotalAdd.Text = Total.ToString();
        }

[注: エラー

dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));
Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value); 

この2つのリン。]

4

2 に答える 2

0

で行インデックスが見つからない場合、例外がスローされiます。行数を 1 減らす必要があります。これにより、値で満たされた行のみをカウントするようにループに指示されます。行を変更する

int i = 0; i <dgvSalesFooterAdd.Rows.Count

int i = 0; i <dgvSalesFooterAdd.Rows.Count - 1

完全なブロックは次のようになります。

        for (int i = 0; i <dgvSalesFooterAdd.Rows.Count - 1; i++)
        {

            dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

            Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
        }
于 2013-11-08T11:33:19.953 に答える
0
  dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a *(Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));
Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value); 

セルを離れるとcell_valueの変更が機能したため、nullである4列目の値を読み取っているため、例外がスローされます...

このリンクを理解すると、より良い画像が得られます.. http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvaluechanged.aspx

このようなコードを試してください..

 void dgvSalesFooterAdd_CurrentCellDirtyStateChanged(object sender,
EventArgs e)
 {
if (dgvSalesFooterAdd.IsCurrentCellDirty)
{
    dgvSalesFooterAdd.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}

  private void dgvSalesFooterAdd_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
    {
        decimal Total = 0;

        decimal a=Convert.ToDecimal(lblTotalAdd.Text);
        for (int i = 0; i <dgvSalesFooterAdd.Rows.Count ; i++)
        {

            dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

            Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
        }
        lblFinalTotalAdd.Text = Total.ToString();
    }
于 2013-09-16T09:57:22.887 に答える