使用数据网格的WPF删除选定的项目

本文关键字:删除 项目 WPF 数据 数据网 网格 | 更新日期: 2023-09-27 18:17:48

我有一个从SQLite表中填充的Datagrid

Connect();
mAdapter = new SQLiteDataAdapter("SELECT * FROM clients", mConn);
mTable = new DataTable();
mAdapter.Fill(mTable);
dataGrid.ItemsSource = mTable.DefaultView;
mConn.Close();

我可以让它删除一个selecteditem但是我怎么能让它根据它们的id来删除selecteditem呢

private void dataGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.Delete)
        {
            if (dataGrid.SelectedItem == null)
                return;
            DataRowView rowView = (DataRowView)dataGrid.SelectedItem;
            Connect();
            using (SQLiteCommand mCmd = new SQLiteCommand("DELETE FROM clients WHERE ID=" + rowView["ID"], mConn))
            {
                mCmd.ExecuteNonQuery();
            }
            mAdapter.Update(mTable);
            mConn.Close();
        }
    }    

使用数据网格的WPF删除选定的项目

看起来您想使用原始查询来删除条目。在本例中,要访问DataGrid上的选定项,您可以使用属性SelectedItems。您可以使用一个查询删除每个条目,也可以在一个查询中删除一个条目块,下面是使用一个查询删除每个条目的代码:

if (e.Key == System.Windows.Input.Key.Delete) {
        if (dataGrid.SelectedItem == null)
            return;
        Connect();
        foreach(var item in dataGrid.SelectedItems.Cast<DataRowView>()) {
           using (var mCmd = new SQLiteCommand("DELETE FROM clients WHERE ID=" + item["ID"], mConn)) {
              mCmd.ExecuteNonQuery();
           }
        }
        mAdapter.Update(mTable);
        mConn.Close();
}

下面是用1个查询删除一个项目块的代码:

if (e.Key == System.Windows.Input.Key.Delete) {
        if (dataGrid.SelectedItem == null)
            return;
        Connect();
        const int blockSize = 100;
        var inOperands = dataGrid.SelectedItems
                                 .Select((e,i) => new { 
                                    row = ((DataRowView) e)["ID"], i        
                                  })
                                 .GroupBy(e => e.i / blockSize)
                                 .Select(g => string.Format("({0})", 
                                              string.Join(",", g.Select(o => o.row))));
        foreach(var inOperand in inOperands) {
           using (var mCmd = new SQLiteCommand("DELETE FROM clients WHERE ID IN " + inOperand, mConn)) {
              mCmd.ExecuteNonQuery();
           }
        }
        mAdapter.Update(mTable);
        mConn.Close();
}

顺便说一下,您应该使用SQLiteParameter而不是手动连接值,以避免查询注入。

正如user2946329所说,您的代码应该可以工作。我认为如果你需要删除多个项目,你需要更多的按钮,你必须设置每个按钮通过单独的变量来删除,或者你可以通过实际的sql数据,例如,循环通过它们

string a = select name, from tbl where name = "Ahmed" 
string b =       select name, from tbl where name = "Ahmed"etc) 

SQLiteCommand mCmd = new SQLiteCommand("DELETE FROM clients WHERE ID=" + a + b, mConn))
        {
            mCmd.ExecuteNonQuery();
        }