从datagridview中删除行

时间:2012-06-25 16:33:35

标签: c# datagridview ms-access-2007

我在删除搜索查询返回的一行数据时遇到问题。 我希望用户可以选择任何一行数据,然后单击删除按钮[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);

    }

    }

}

2 个答案:

答案 0 :(得分: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语句直接从数据库中删除它。

  3. 如果您选择第一选项,则可以在表单上填写dt字段。这是因为您现在只能通过button1_Click事件中的((DataRow)row.DataBoundItem).TableGridView1.DataSource访问它。同时使DataAdapter成为一个字段会使这更容易

    e.g。

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

    除此之外,您可以选择仅按下按钮1_Click中的dt.Rows.Remove(dRow);并将Adapter.Update(dt)推迟到稍后的“保存”按钮。

    如果选择选项2,则需要将其从DataTable中删除或刷新DataTable

    e.g。

    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 
    

答案 1 :(得分: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);
}