2016-11-07 102 views
1

我想刷新數據網格視圖後用戶插入一些項目到數據庫。我試圖清空視圖的數據源併爲其應用新的數據源,但它不起作用。如何在更新時刷新數據網格視圖?從C#窗口#

下面是系統的流程:

  1. 單擊添加項目,然後彈出一個add-item form
  2. 輸入產品詳細信息,然後點擊按鈕插入數據
  3. 查看更新< -----問題

enter image description here

在這個部分,將會有two forms和一個database claee。它們是Form1(數據視圖),Add-item formdatabase_function.cs

這是我的上database class代碼:

public class database_function 
{ 
    OleDbConnection connect = new OleDbConnection(); 


    public database_function() 
    { 
     connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\sys_db.accdb"; 
    } 

    public void database_connect(String item_code, String des, String unit, double price) 
    { 
     Form1 f1 = new Form1(); 
     try 
     { 

      connect.Open(); 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connect; 
      command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")"; 
      command.ExecuteNonQuery(); 

      connect.Close(); 
     } 
     catch(Exception e) 
     { 
      Debug.WriteLine(e.Source); 
      connect.Close(); 
     } 
     f1.refresh_dataGridView(); 
    } 



    //return the dataGridView to form 1, and show the database data on it. 
    public DataTable get_view() 
    { 
     connect.Open(); 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connect; 
     string query = "Select item_code, description, unit, price from item"; 
     command.CommandText = query; 

     OleDbDataAdapter da = new OleDbDataAdapter(command); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     connect.Close(); 
     Debug.WriteLine("return dataTable"); 
     return dt; 
    } 
} 

這裏是關於代碼form1: //獲取當Form 1被加載 私人無效Form1_Load的數據源(對象發件人,EventArgs的) { dataGridView1.DataSource = df.get_view();
}

//Refresh the view 
    public void refresh_dataGridView() 
    { 
     dataGridView1.DataSource = null; 
     dataGridView1.DataSource = df.get_view(); 
     Debug.WriteLine("refuesh"); 
    } 

這裏是add-item. form

private void button1_Click(object sender, EventArgs e) 
    { 
     //Get textfield data.... 

     //If user doesn't input the item data, show the error message. Else, update to database. 
     if (error == true) 
     { 
      error_msg_form emf = new error_msg_form(); 
      emf.Show(); 
     } 
     else 
     { 
      Form1 f1 = new Form1(); 
      database_function df = new database_function(); 
      df.database_connect(item_code_tb.Text, des_tb.Text, unit_tb.Text, Convert.ToDouble(unit_price_tb.Text)); 
      //f1.refresh_dataGridView(); 
     } 
    } 

不過,我調試日誌將顯示refresh,意味着它可以在refresh_dataGridView()運行。但它無法刷新視圖。

這是什麼問題呢?或者有另一種方法可以做到這一點? 謝謝

+1

'database_connect'方法創建'Form1'的新實例。你需要在已經存在的實例中更新'datagridview' – Fabio

+0

'df.get_view()'在你調試時是否可以? – Badiparmagi

+0

'database_connect()'是以另一種形式插入數據的地方創建的。而'gridView'是另一種形式。 – Capslock10

回答

1

當你調用database_connect方法,通過形式作爲參考下面this

private void button1_Click(object sender, EventArgs e) 
{ 
    //Get textfield data.... 

    //If user doesn't input the item data, show the error message. Else, update to database. 
    if (error == true) 
    { 
     error_msg_form emf = new error_msg_form(); 
     emf.Show(); 
    } 
    else 
    { 
     //Form1 f1 = new Form1(); 
     database_function df = new database_function(); 
     df.database_connect(this, item_code_tb.Text, des_tb.Text, unit_tb.Text, Convert.ToDouble(unit_price_tb.Text)); 
     //f1.refresh_dataGridView(); 
    } 
} 

然後,在如下面的方法中添加參數Form1 form1和使用相同的附圖調用form1.refresh_dataGridView()

public void database_connect(Form1 form1, String item_code, String des, String unit, double price) 
    { 
     //Form1 f1 = new Form1(); 
     try 
     { 

      connect.Open(); 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connect; 
      command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")"; 
      command.ExecuteNonQuery(); 

      connect.Close(); 
     } 
     catch(Exception e) 
     { 
      Debug.WriteLine(e.Source); 
      connect.Close(); 
     } 
     form1.refresh_dataGridView(); 
    } 

另外,更改代碼,如下刷新數據網格視圖,

public void refresh_dataGridView() 
    { 
     dataGridView1.DataSource = typeof(List); 
     dataGridView1.DataSource = df.get_view(); 
     Debug.WriteLine("refuesh"); 
    } 
+0

你可以發佈更新的代碼,你調用的東西就像'database_function.database_connect'(這個'?' – Aruna

+0

@ Capslock10,我已經更新了'refresh_dataGridView'方法,請嘗試一下,如果不行的話, database_function.database_connect(這段代碼爲 – Aruna

+0

@ Capslock10,發佈了'onclick'事件代碼隊友 – Aruna

1

你最好重構你的代碼並將數據庫訪問代碼分離到單獨的類文件中。那麼你可以從其他類,形式等調用這些函數..

在你的表單只是後面插入項目方法,你可以設置gridview的數據源,例如:

database_function df = new database_function(); 
df.InsertItem("sdfsdf", "Description", "KG", 5); 
//load data again 
dataGridView1.DataSource = df.get_view(); 

需要兩種方法,一種插入和一個用於獲取信息

public class database_function 
{ 
    public void InsertItem(String item_code, String des, String unit, double price) 
     { 
      //Form1 f1 = new Form1(); 
      try 
      { 
       connect.Open(); 
       OleDbCommand command = new OleDbCommand(); 
       command.Connection = connect; 
       command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")"; 
       command.ExecuteNonQuery(); 

       connect.Close(); 
      } 
      catch(Exception e) 
      { 
       Debug.WriteLine(e.Source); 
       connect.Close(); 
      } 
     //f1.refresh_dataGridView(); 
     } 

public DataTable get_view() 
    { 
     connect.Open(); 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connect; 
     string query = "Select item_code, description, unit, price from item"; 
     command.CommandText = query; 

     OleDbDataAdapter da = new OleDbDataAdapter(command); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     connect.Close(); 
     return dt; 
    } 

}

+0

OP的問題是'Insert'方法和'update'方法是不同的形式 – Fabio

+0

@Fabio是的,那是因爲在插入函數中創建了新的表單。我所建議的是重構代碼,讓UI執行數據源設置,而db相關函數則在另一個類的不同方法中處理。 – Damith

+0

即使他將Db邏輯移動到專用類 - 主要問題是插入行發生在另一種形式。和OP需要以某種方式通知主窗體成功插入和更新datagridview – Fabio

0

這是我用我的代碼:

private void Form1_Activated(object sender, EventArgs e) { 
     if (GlobalVariables.bReload == false) { 
      Activated -= Form1_Activated; 
      GlobalVariables.bReload = true; 
      dgv1.DataSource = "my datasource" 
      dgv1.Refresh(); 
      Activated += Form1_Activated; 
     } 
    } 

在我來說,我想在對子窗體進行修改並返回到我的datagridview所在的主窗體後觸發更新。我使用了一個布爾類型的全局變量來管理它。

0

我假設你在項目被插入數據庫時​​關閉「AddItem」表單。 我的建議作出關於成功插入通知更清晰的沒有通過引用,並通過使公衆

更改您database_connect方法基於查詢的結果返回true/false暴露形式的控制

public void database_connect(String item_code, String des, String unit, double price) 
{ 
    try 
    { 
     connect.Open(); 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connect; 
     command.CommandText = "INSERT into item (item_code, description, unit, price) values ('" + item_code + "', '" + des + "', '" + unit + "', " + price + ")"; 
     int insertedRows = command.ExecuteNonQuery(); 

     return insertedRows > 0; 
    } 
    catch(Exception e) 
    { 
     Debug.WriteLine(e.Source); 
    } 
    finally 
    { 
     connect.Close(); 
    } 

    // false will be returned if exception will be thrown 
    return false; 
} 

然後在AddItem形式如果項目已成功添加,請將Form.DialogResult屬性設置爲Ok

public class AddNewItemForm : Form 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (error == true) 
     { 
      error_msg_form emf = new error_msg_form(); 
      emf.Show(); 
     } 
     else 
     { 
      database_function df = new database_function(); 
      bool isAdded = df.database_connect(item_code_tb.Text, 
               des_tb.Text, 
               unit_tb.Text, 
               Convert.ToDouble(unit_price_tb.Text)); 

      if(isAdded) 
      { 
       this.DialogResult = DialogResult.Ok; 
      } 
     } 
    }    
} 

然後在Main窗體中使用ShowDialog方法獲取成功插入的結果。

public class MainForm: Form 
{ 
    private void ButtonAddItem_Click(object sender, EventArgs e) 
    { 
     using(var addItemForm = new AddNewItemForm()) 
     { 
      if(addItemForm.ShowDialog() == DialogResult.Ok) 
      { 
       // here you can update your DataGridView 
       this.DataGridView.DataSource = df.get_view(); 
      } 
     } 
    }   
}