1

我在删除搜索查询返回的一行数据时遇到问题。我希望用户可以选择任何一行数据并单击删除按钮 [button1_click] 将其从数据库中删除。这是一个窗体应用程序。

希望你能给我建议。非常感谢。下面是我的代码

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 并调用更新。

  2. 通过 OleDbCommand 使用 DELETE SQL 语句直接将其从数据库中删除。

dt如果您选择选项一,您会在表单上填写一个字段,这样您会得到很好的服务。这是因为您现在只能通过button1_Click 事件((DataRow)row.DataBoundItem).TableGridView1.DataSource在 button1_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)到稍后在 Save 按钮中执行。

如果您使用选项二,则需要将其从 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 表的唯一标识符在单元格零中):

哦,dtcommand 是我用于常见数据库内容的数据库命令类的类实例。

        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 回答