2015-10-15 91 views
1

我有得到从SQLite的桌上摆满一个DataGridWPF与DataGrid中删除所选项目

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

我可以把它删除将selectedItem但我怎么可以把它删除selecteditems根据其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(); 
     } 
    }  
+1

你的代码应该工作并根据'id'删除。你怎么了? –

+0

我想删除多个项目,但我不知道如何获取所有项目ID –

回答

1

看起来你要使用原始查询删除的项目。在这种情况下,要访问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而非人工拼接的值,以避免SQL注入的方式。

+0

感谢您的帮助,但没有任何“投”的“datagrid.selecteditems”也许是Windows窗体,我使用WPF 进行查询注入我只是让这个程序训练使用新的东西,我不会使用它在一个真正的程序,但再次感谢提及 –

+0

@AhmedMohammed你需要使用'System.Linq;'添加,它是由静态类System.Linq.Enumerable支持的Linq功能。 –

1

由于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(); 
     } 
+0

是的我想要删除多个项目,我从数据网格中选择,但我不知道如何获取所有项目ID到在我的SQLite命令中使用它们 –

+0

这些项目是物理键盘按钮还是仅来自数据库的数据? – shucode

+0

我填充数据从数据库中的数据用户能够从该数据网格多选择项目,并删除他们,当他做我想从数据库中删除基于他们的ID相同的数据 –