c# - WPF 使用数据网格删除所选项目

标签 c# wpf sqlite datagrid

我有一个从 SQLite 表填充的 Datagrid

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

我可以让它删除选定的项目,但是如何让它根据 ID 删除选定的项目

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();
        }
    }    

最佳答案

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

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,而不是手动连接值以避免查询注入(inject)。

关于c# - WPF 使用数据网格删除所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149938/

相关文章:

c# - 如何将 C# 接口(interface)传递给外部 COM 对象供其使用?

c# - 绑定(bind)到 ObservableCollection 以显示前 X 个项目 c# WPF

java - 从另一个 Activity 中检索 Spinner 自定义位置以在另一个 Spinner 中使用

c# - C#中 bool 值和 bool 值的区别?

c# - 在 C++ 应用程序中使用 C# dll

c# - virtualizingstackpanel 如何在不实例化实际项目的情况下计算子大小?

sqlite - 如何将从 Osquery 触发的 SQL 查询的输出保存到文件

java - 问 : How to update 1 column with same data for different IDs (android)

c# - 就良好的编程而言,使用键枚举或 Ascii 代码更好?

c# - 如何获取 CollectionViewSource 的第一个元素?