1

すべてのフォーラムを検索していますが、解決策が見つかりません。簡単なはずですが、うまくいきません。

DataGridViewDoctors テーブルをソースとする「doctorsDataGridView」という名前を作成しました。ユーザーにアイテムの追加を許可したくありませんが、削除と編集を許可します。最初に削除するには、次のコードを入力します。

private void doctorsDataGridView_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
    // Update the balance column whenever rows are deleted.
    try
    {
        SqlCommand cmd = new SqlCommand("DELETE FROM [Doctors] WHERE ([DoctorCode] = @code)", Welcome.con);
        cmd.Parameters.Add("@code", SqlDbType.Int).Value = doctorsDataGridView.Rows[e.RowIndex].Cells["DoctorCode"].Value;
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
        { MessageBox.Show(ex.ToString()); }
}

private void doctorsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
    this.Validate();
    this.doctorsBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.clincDataSet);
}

private void AllDoctors_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'clincDataSet.Doctors' table. You can move, or remove it, as needed.
    this.doctorsTableAdapter.Fill(this.clincDataSet.Doctors);
}

しかし、行を削除しようとすると、データベースからではなく、行からのみ削除されDatagridViewます。

4

3 に答える 3

3

コードを配置してみてくださいDataGridView.UserDeletingRow Event

private void doctorsDataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    // Update the balance column whenever rows are deleted.
    try
    {
        SqlCommand cmd = new SqlCommand("DELETE FROM [Doctors] WHERE ([DoctorCode] = @code)", Welcome.con);
        cmd.Parameters.Add("@code", SqlDbType.Int).Value = doctorsDataGridView.Rows[e.RowIndex].Cells["DoctorCode"].Value;
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
        { MessageBox.Show(ex.ToString()); }
}
于 2013-02-02T23:36:37.220 に答える
1

ここでは何も問題はありませんが、私があなただったら次のようにします。

  • SQL Server プロファイラーを開き、最初に SQL サーバーに何かが到達するかどうかを確認します
  • データベース参照を確認しますか? Doctors テーブルは他のテーブルから参照されていますか? 多分それはあなたがデータを削除するのを妨げています
  • デバッガーを使用してコードをステップ実行し、cmd.ExecuteNonQuery() を実行する前に SQL ステートメントをチェックアウトします - SSMS で同じステートメントを手動で実行してみてください
于 2013-02-02T19:39:10.840 に答える
1

あなたのSQLコマンドが正しく実行されていると確信していますか?
MSDN: "ExecuteNoneQuery() UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受ける行数です" ため、ExecuteNonewQuery() は 1 を返す必要があります。

注: datagridview の rowsremoved イベントは、データがロードされるたびに呼び出されます。また、データがロードされるたびに既存の行が削除されることもある程度理にかなっています。技術的には、イベントが呼び出される必要があります。

いつロードしていて、いつロードしていないかを知るために、プライベートブール変数を持つことができます。

    private bool IsLoading { get; set; }

    private void MyForm_Load(object sender, EventArgs e)
{
    this.IsLoading = true;
// do stuff
    this.IsLoading = false;
}

private void DataGridView_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
            if (!this.IsLoading)
            {
                return;
            }

   //do stuff
}
于 2013-02-02T23:06:25.837 に答える