2014-05-07 16 views
0

我想在用戶單擊「刪除」時同時從datagrid和數據庫中刪除選定的數據。它不工作,錯誤消息顯示「索引超出範圍。必須是非負值,小於集合的大小。參數名稱:索引」 任何人都可以幫助我解決這個問題。刪除不在Datagrid視圖的選定數據中工作

private void btnDeleteCustomer_Click(object sender, EventArgs e) 
{ 
    string strSqlConnection = @"Data Source = KK\SQLEXPRESS; Integrated Security = SSPI; Initial Catalog = JeanDB"; 

    if ((dgvCustomerView.Rows.Count>0) && (dgvCustomerView.SelectedRows[1].Index != dgvCustomerView.Rows.Count)) 
    { 
     SqlConnection sqlconn = new SqlConnection(strSqlConnection); 


     DataSet dsCustomers = new DataSet(); 
     int iCustomerID = Convert.ToInt32(dgvEmpView.SelectedRows[0].Cells[0].Value.ToString()); 
     string QueryDelCus = @"Delete from dbo.Customers WHERE CustomerID = @iCustomerID"; 
     SqlDataAdapter sdaCustomer = new SqlDataAdapter(QueryDelCus, sqlconn); 

     sqlconn.Open(); 
     DataTable dtEmployee = new DataTable("Customers"); 
     sdaCustomer.Fill(dsCustomers, "Customers"); 
     sqlconn.Close(); 
     dgvEmpView.Rows.RemoveAt(dgvEmpView.SelectedRows[0].Index); 
     MessageBox.Show("Deleted Successfully"); 
    } 
} 
+0

使用DataAdapter時,不需要打開和關閉Connection對象。它會爲你打開和關閉連接。你似乎沒有使用dtEmployee。 – LarsTech

回答

0

代替刪除可以重新綁定網格:

dgvEmpView.DataSource = dsCustomers; 
dgvEmpView.DataBind(); 
MessageBox.Show("Deleted Successfully"); 

和刪除ExecuteNonQuery用於:

SqlCommand cmd = new SqlCommand(QueryDelCus, sqlconn); 

sqlconn.Open(); 

cmd.ExecuteNonQuery(); 
0

除非你有選擇引用SelectedRows兩行[1]是錯的。數組索引始終以零開始。 (也許這僅僅是一個類型,因爲其他行引用正確的行被刪除)

if ((dgvCustomerView.Rows.Count>0) && 
    (dgvCustomerView.SelectedRows[0].Index != dgvCustomerView.Rows.Count)) 
{ 
    .... 

但隨後,刪除該行的數據庫,你並不需要使用的SqlDataAdapter。 你可以直接與一個SqlCommand

int iCustomerID = Convert.ToInt32(dgvEmpView.SelectedRows[0].Cells[0].Value.ToString()); 
string QueryDelCus = @"Delete from dbo.Customers WHERE CustomerID = @iCustomerID"; 
SqlCommand cmd = new SqlCommand(QueryDelCus, sqlconn); 
cmd.Parameters.AddWithValue("@iCustomerID", iCustomerID); 
sqlconn.Open(); 
cmd.ExecuteNonQuery(); 

工作終於,你可以簡單地刪除從網格中選定的行沒有進一步的查詢

dgvEmpView.Rows.RemoveAt(dgvEmpView.SelectedRows[0].Index); 
0

如果不使用SQL參數,然後用普通的SQL查詢。

DataSet dsCustomers = new DataSet(); 
int iCustomerID = Convert.ToInt32(dgvEmpView.SelectedRows[0].Cells[0].Value.ToString()); 
string QueryDelCus = @"Delete from dbo.Customers WHERE CustomerID = "+ iCustomerID.ToString(); 
SqlDataAdapter sdaCustomer = new SqlDataAdapter(QueryDelCus, sqlconn);