1

検索クエリによって返されたデータの行を削除する際に問題が発生しました。ユーザーがデータの任意の行を選択し、削除ボタン[button1_click]をクリックしてDBからデータを削除できるようにしたいと思います。これはWindowsフォームアプリケーションです。

あなたが私に助言できることを願っています。どうもありがとう。以下は私のコードです

public partial class Search : Form
{
    public Search()
    {
        InitializeComponent();
        string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Project\DB_Booking.mdb;";
        DataTable ds = new DataTable();
        using (var cn = new OleDbConnection(strConn))
        {
            cn.Open();
            using (var cmd = new OleDbCommand("SELECT * FROM staff", cn))
            {
                using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
                    adp.Fill(ds);

                comboBox1.DataSource = ds;
                comboBox1.ValueMember = "sname";
                comboBox1.SelectedIndex = 0;

            }
        }

    }



    private void btn_search_bystaffname_Click(object sender, EventArgs e)
    {
        string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Project\DB_Booking.mdb;";

        DataTable dt = new DataTable();

           using (var cn = new OleDbConnection(strConn))
            {
                cn.Open();
                using (var cmd = new OleDbCommand("SELECT * FROM booking WHERE sname = @sname", cn))
                {
                    //cmd.Parameters.AddWithValue("@bdate", dtp_search_date.Value.Date);
                    cmd.Parameters.AddWithValue("@sname", comboBox1.SelectedValue);

                    using (OleDbDataAdapter oda = new OleDbDataAdapter(cmd))
                        oda.Fill(dt);
                    GridView1.DataSource = dt;

                    GridView1.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                    GridView1.Columns[1].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                    GridView1.Columns[2].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                    GridView1.Columns[3].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                    GridView1.Columns[4].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                    GridView1.Columns[5].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;

                    GridView1.Columns[0].HeaderText = "Booking ID";
                    GridView1.Columns[1].HeaderText = "Client Name";
                    GridView1.Columns[2].HeaderText = "Booking Date";
                    GridView1.Columns[3].HeaderText = "Booking Time";
                    GridView1.Columns[4].HeaderText = "Client Contact";
                    GridView1.Columns[5].HeaderText = "Staff Name";

                    this.GridView1.DefaultCellStyle.Font = new Font("Times New Roman", 12);
                    this.GridView1.DefaultCellStyle.ForeColor = Color.Blue;
                    this.GridView1.DefaultCellStyle.BackColor = Color.Beige;
                    this.GridView1.DefaultCellStyle.SelectionForeColor = Color.Yellow;
                    this.GridView1.DefaultCellStyle.SelectionBackColor = Color.Black;

                    this.GridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                    this.GridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                    this.GridView1.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                    this.GridView1.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                    this.GridView1.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                    this.GridView1.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;

                }

            }
        }

    private void btn_search_bydate_Click(object sender, EventArgs e)
    {
        string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Project\DB_Booking.mdb;";

        DataTable dt = new DataTable();

        using (var cn = new OleDbConnection(strConn))
        {
            cn.Open();
            using (var cmd = new OleDbCommand("SELECT * FROM booking WHERE bdate = @bdate", cn))
            {
                cmd.Parameters.AddWithValue("@bdate", dtp_search_date.Value.Date);
                cmd.Parameters.AddWithValue("@sname", comboBox1.SelectedValue);

                using (OleDbDataAdapter oda = new OleDbDataAdapter(cmd))
                    oda.Fill(dt);
                GridView1.DataSource = dt;

                GridView1.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                GridView1.Columns[1].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                GridView1.Columns[2].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                GridView1.Columns[3].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                GridView1.Columns[4].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;
                GridView1.Columns[5].HeaderCell.Style.Alignment = DataGridViewContentAlignment.TopCenter;

                GridView1.Columns[0].HeaderText = "Booking ID";
                GridView1.Columns[1].HeaderText = "Client Name";
                GridView1.Columns[2].HeaderText = "Booking Date";
                GridView1.Columns[3].HeaderText = "Booking Time";
                GridView1.Columns[4].HeaderText = "Client Contact";
                GridView1.Columns[5].HeaderText = "Staff Name";

                this.GridView1.DefaultCellStyle.Font = new Font("Times New Roman", 12);
                this.GridView1.DefaultCellStyle.ForeColor = Color.Blue;
                this.GridView1.DefaultCellStyle.BackColor = Color.Beige;
                this.GridView1.DefaultCellStyle.SelectionForeColor = Color.Yellow;
                this.GridView1.DefaultCellStyle.SelectionBackColor = Color.Black;

                this.GridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                this.GridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                this.GridView1.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                this.GridView1.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                this.GridView1.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                this.GridView1.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;

            }

        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        DataGridViewRow row = GridView1.SelectedRows[0];
        GridView1.Rows.Remove(row);

    }

    }

}
4

2 に答える 2

2

これがあなたが変更したい方法だと思います

private void button1_Click(object sender, EventArgs e)
{
    GridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    DataGridViewRow row = GridView1.SelectedRows[0];
    GridView1.Rows.Remove(row);

}

これGridView1.Rows.Remove(row);は DaDataGridViewRowCollection から項目を削除するだけで、データベースからは削除しません。

データベースから削除するには、次のいずれかを実行できます

  1. 「DataTable」から削除してから、DataAdapter を使用して update を呼び出します。

  2. OleDbCommand を介して DELETE SQL ステートメントを使用して、データベースから直接削除します。

オプション 1 を選択した場合はdt、フォームにフィールドを作成することで十分に機能します。((DataRow)row.DataBoundItem).Tableこれは、現在、またはGridView1.DataSourcebutton1_Click イベントでしかアクセスできないためです。また、DataAdapter をフィールドにすると、これが簡単になります

例えば

GridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
DataGridViewRow row = GridView1.SelectedRows[0];
DataRow dRow = (DataRow)row.DataBoundItem;
dt.Rows.Remove(dRow);
Adapter.Update(dt);

余談ですがdt.Rows.Remove(dRow);、button1_Click でのみ実行Adapter.Update(dt)し、[保存] ボタンで後で実行することを選択できます。

オプション 2 を使用する場合は、DataTable から削除するか、DataTable を更新する必要があります

例えば

GridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
DataGridViewRow row = GridView1.SelectedRows[0];

OleDbCommand cmd = new OleDbCommand(   

using (var cn = new OleDbConnection(strConn))
{
   cn.Open();
   // not 100% this delete syntax is correct for Access
   using (var cmd = new OleDbCommand("DELETE booking WHERE [Booking ID] = @BookingId", cn)) 
   {
       cmd.Parameters.AddWithValue("@BookingId", dRow["Booking Id"]);
       cmd.ExecuteNonQuery();     
   }
}

// Do this to update the in-memory representation of the Data
DataRow dRow = (DataRow)row.DataBoundItem;
dt.Rows.Remove(dRow);

// Or just refresh the datatable using code similar as your search methods 
于 2012-06-25T16:46:53.920 に答える
0

これが私のアプリケーションでのやり方です(mysqlテーブルの一意の識別子はセル0にあります):

ああ、dtcommandは、私が一般的なdbのものに使用するデータベースコマンドクラスのクラスインスタンスです。

        int userDeleteIndex;
        if (int.TryParse(datagridview.Rows[rowIndex].Cells[0].Value.ToString(), out userDeleteIndex))
        {
            if (MessageBox.Show("Delete " + recordidentifyingdata + "? ", "Delete " + userDeleteIndex.ToString(), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    string updateUserSql = "DELETE FROM table WHERE user_id = " + userDeleteIndex.ToString() + "; ";
                    dtCommand.UpdateTable(updateUserSql);
                    InitializeUserDataView();
                    // Initalize userdataview refreshes the datagridview with the updated info
                }
                catch (Exception err)
                {
                   Error trapping goes here
                }

これが私のクラスのデータベース更新セクションです。

public int UpdateTable(string updateString, string MySqlConnectionString)
{
    int returnValue = 0;
    MySqlConnection connection = new MySqlConnection(MySqlConnectionString);
    MySqlCommand command = new MySqlCommand(updateString, connection);
    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    catch (Exception err)
    {
        WriteErrorLog("Unable to update table: " + err.ToString() +
            " - Using SQL string: " + updateString + ".");
        //MessageBox.Show("An error has occured while updating the database.\n" +
        //"It has been written to the file: " + errorFile + ".", "Database Error");
        returnValue = -1;
    }
    finally
    {
        connection.Close();
    }
    return (returnValue);
}
于 2012-06-25T16:42:09.473 に答える