2011-07-19 82 views
0

我的最後一個問題是關閉,因爲它是不明確的,所以我會再試一次,因爲我真的需要幫助這個...的DataGridView編輯細胞

我使用Visual Studio 2010與OLEDB連接。現在我正在開發一個窗體。我注意到一個datagridview允許你有一個編輯/添加/刪除模式,所以我想能夠使用它。

我想要做的是用cellcontentchanged事件來編輯我的數據庫。當我更改內容並離開時,它會問我是否要編輯此單元格。如果我說是的,那麼這個單元格將會改變。我確定了ReadOnly = falseenabled = true。之前,我讀過的東西,我只是這樣做:

adapter.Update(dataset); 

或類似的東西。但是,這並不能保存我的數據庫的更改。我也不確定如何編程編輯。我也不確定是否應該有OLEDB更新命令。如果有任何不清楚的地方,請回復,我很樂意澄清。謝謝!

編輯:抱歉,如果它仍然很難理解!
這裏是一些代碼...

private void dgv_DataLookup_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 

     DialogResult dr; 
     dr = MessageBox.Show("Are you sure you want to edit this field?", "Edit Cell", MessageBoxButtons.YesNo); 

     if (dr == DialogResult.Yes) 
     { 
      //update the table in my database 
     } 
    } 

這是不是很多呢,但我希望你可以嘗試看看我想要再做

編輯:這是所有相關的代碼對於這部分(這是顯示我想要編輯的datagridview的代碼)

OleDbConnection cs; 
    OleDbDataAdapter da = new OleDbDataAdapter(); 

    DataSet dsB = new DataSet(); 



    //If clicked search button 
     else if (combo_View.Text == "Orders") 
     { 

      da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE (VendorName = @VendorName OR @VendorName = '') AND (CustomerName = @CustomerName OR @CustomerName = '') AND ((@From IS NULL AND @To IS NULL) OR orderDate BETWEEN @From AND @To) AND (ItemNum = @ItemNum OR @ItemNum = '') AND (PO = @PO OR @PO = '') ORDER BY CustomerName", cs); 

      da.SelectCommand.Parameters.Add("@VendorName", OleDbType.VarChar).Value = combo_VendorView.Text.ToString(); 
      da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = combo_CustomerView.Text.ToString(); 

      if (!chk_viewAllDates.Checked) 
      { 
       da.SelectCommand.Parameters.Add("@From", OleDbType.Date).Value = "#" + tp_viewFrom.Value.Date.ToString("M/d/yyyy") + "#"; 
       da.SelectCommand.Parameters.Add("@To", OleDbType.Date).Value = "#" + tp_viewTo.Value.Date.ToString("M/d/yyyy") + "#"; 
      } 

      else 
      { 
       da.SelectCommand.Parameters.Add("@From", OleDbType.Date).Value = DBNull.Value; 
       da.SelectCommand.Parameters.Add("@To", OleDbType.Date).Value = DBNull.Value; 
      } 

      da.SelectCommand.Parameters.Add("@PO", OleDbType.VarChar).Value = txt_POLookup.Text.ToString(); 
      da.SelectCommand.Parameters.Add("@ItemNum", OleDbType.VarChar).Value = combo_ItemNumLookup.Text.ToString(); 

      dsB.Clear(); 
      da.Fill(dsB); 
      dgv_DataLookup.DataSource = dsB.Tables[0]; 

     } 

請讓我知道如果你需要更多的代碼。任何幫助表示讚賞:)

+0

在這裏添加一些代碼 –

+0

@wilson - 這個問題還是很難理解的。 1)你在什麼環境下工作?你提到datagridview,但這是一個winforms控件,你也提到asp.net。 2)你需要做什麼?每次單元格更改時,您似乎都會要求保存數據,爲什麼不在其他時間? 3)提供一些代碼,試圖讓我們更深入地瞭解您需要什麼。 –

+0

你有沒有看過你的代碼正在一步一步做?當你調用adapter.Update(dataset)時,你的數據集實際上是否有變化?如果切出datagridview並直接更新數據集會發生什麼? –

回答

0

自己修復了這個問題。只需使用owning column owningrow來獲得我需要的價值。謝謝

0

我不太確定你在這裏問什麼,但我會做一些假設,你只是問如何將編輯的數據保存回數據庫。我不會使用CellValueChanged事件。通常您只需讓用戶編輯網格中的數據,然後讓他們單擊保存按鈕或將表格數據保存在表格關閉中。

void Save() 
{ 
    OleDbConnection con=new OleDbConnection("Put your connect string here"); 
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM TestQuery", con); 
    OleDbCommandBuilder cb = new OleDbCommandBuilder(da); 
    DataTable tbl = dsB.Tables[0]; 
    da.Update(tbl); 
    tbl.AcceptChanges(); 
} 

您可能想要重複使用已經創建的一些對象,如連接,但這是基礎知識。

+0

謝謝你的回答。我在我的代碼中試過這個,當我使用函數時出現了這個錯誤。動態SQL生成不支持針對多個基表。 –

+0

DataAdapter中的select語句必須是不帶Where子句的簡單選擇,並且只能從一個表中進行選擇。換句話說,如果這是您正在嘗試執行的操作,則無法使用原始選擇語句或原始DataAdapter。如果你準確地使用了「SELECT * FROM TestQuery」,並且你得到了錯誤,那麼CommandBuilder就太愚蠢了,你必須手工創建你的Insert和Update命令對象。這非常乏味。 – beater