web-dev-qa-db-ja.com

エラー:削除された行の情報には行からアクセスできません

これが懸念される人のために、私はこのエラーから抜け出すためにかなりの時間を探しました

「削除された行の情報には、その行からアクセスできません」

行がデータテーブルから削除されると、通常の方法ではアクセスできないことを理解しているため、このエラーが発生します。大きな問題は、希望する結果を得るために何をすべきかわからないことです。これについては、以下で概説します。

基本的に、「dg1」の行が削除されると、その下の行が削除された行の代わりになり(明らかに)、削除された行のインデックスを継承します。このメソッドの目的は、削除された行をインデックス値として取得した行インデックスを(データセット内の対応する値から取得することにより)置換およびリセットすることです。

現在、ラベル(lblText)を使用してプロセスからの応答を取得しようとしていますが、最後のネストされたifステートメントが値を比較しようとするとクラッシュします。

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

void dg1_Click(object sender, EventArgs e)
    {
        rowIndex = dg1.CurrentRow.Index; //gets the current rows
        string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value);

        if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted")
        {

            for (int i = 0; i < dg1.Rows.Count; i++)
            {

                if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
                // ^ **where the error is occurring**
                {
                    lblTest.Text = "Aha!";
                    //when working, will place index of compared dataset value into                                   rowState, which is displaying the current index of the row I am focussed on in 'dg1'
                }
            }
        }

事前に助けてくれてありがとう、本当に検索しました。簡単なグーグル検索で簡単に見つけられるなら、私DIDが試してみたので、繰り返し私を憎むことを許してください。

  • gc
31
zillaofthegods

削除された行では、内部ifステートメントのデータ列の現在の値は使用できません。削除された行の値を取得するには、元の値が必要であることを指定します。これでエラーが修正されます:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)
35
firedfly

DataSetのAcceptChanges()メソッドを使用して、削除を完全に適用することもできます。

ds.Tables[0].Rows[0].Delete();
ds.AcceptChanges();
45
Gavin

「クラッシュする場合」では、値にアクセスする前に行が削除されているかどうかを確認できます。

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted &&
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value)
{
    // blaaaaa
}

また、RowStateをDataRowState.Deletedと比較する代わりに、ToString()する理由がわかりません。

14
Tipx

行を削除した後、グリッドをデータテーブルに再バインドし、インデックスを手動でリセットする必要はありません。データテーブルはそれを処理します。

そのため、グリッドのデータソースを再バインドする必要があります。

0
TalentTuner