2013-04-30 83 views

回答

0

這是一個有點長,但我會盡量=)

假設你沒有額外的邏輯,除了把數據到DataGridView,因此邏輯層功能簡單地調用數據層功能。
現在在這個示例中,我們有一個2 dgv,一個用於訂單詳細信息(只讀)和一個特定訂單行的第二個表單 - 在此dgv中,我們爲產品添加一個ComboBox,另一個用於保存按鈕。

在窗體加載我把這個簡單的FUNC,

private void setOrderGridView() 
    { 
     BindingSource orderSrc = new BindingSource(logic.GetOrderDetailsDS(FrmOrder.currentOrderID), "tblOrders"); 
     dgvOrdrdtls.DataSource = orderSrc; 

     var src = logic.GetProductTable(); 
     BindingSource detailSrc = new BindingSource(orderSrc, "orderdetails"); 
     dgvLines.DataSource = detailSrc; 

     DataGridViewComboBoxColumn pr = new DataGridViewComboBoxColumn(); 
     pr.HeaderText = "Product"; 
     pr.Name = "product"; 
     pr.DataSource = src; 
     pr.ValueMember = "pdctId"; 
     pr.DisplayMember = "prdctDsc"; 
     pr.DataPropertyName = "ordrPrdctid"; 

     dgvLines.Columns.Add(pr); 

    } 

下面你將看到的功能GetOrderDetailsDS(..)GetProductTable()
這一切是負載DGV的,你完成輸入或編輯DGV後,btnSave_Click(..)請致電SaveChanges()函數。

Hare DAL代碼。

public class DALimp : iDAL 
{ 
    string connStr; 
    SqlConnection conn; 
    SqlCommand cmd;   
    DataSet ds; 
    SqlDataAdapter da; 

    public DALimp() 
    { 
     connStr = ConfigurationManager.ConnectionStrings["StoreDBConnectionString"].ConnectionString; 
     conn = new SqlConnection(connStr); 

    } 

    public DataSet GetOrderDetailsDS(int oId) 
    { 
     var select = "SELECT * FROM tblOrders WHERE orderId='"+oId+"'"; 
     ds = new DataSet(); 
     cmd = new SqlCommand(select, conn); 

     try 
     { 
      conn.Open(); 
      ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "tblOrders"); 
     } 
     catch (Exception ex) 
     { throw ex; } 
     finally 
     { conn.Close(); } 

     return ds; 
    } 
    public DataTable GetProductTable() 
    { 
     cmd = new SqlCommand("SELECT * FROM tblProducts", conn); 
     da = new SqlDataAdapter("SELECT * FROM tblorderLines", conn); 
     da.InsertCommand = new SqlCommand("INSERT INTO tblorderLines (ordrNumid,ordrPrdctid,ordrQuantity) Values(@oid,@pid,@qnt)", conn); 
     da.InsertCommand.Parameters.Add("@oid", SqlDbType.Int, 0, "ordrNumid"); 
     da.InsertCommand.Parameters.Add("@pid", SqlDbType.Int, 0, "ordrPrdctid"); 
     da.InsertCommand.Parameters.Add("@qnt", SqlDbType.SmallInt, 0, "ordrQuantity"); 

     try 
     { 
      conn.Open(); 
      ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "tblProducts"); 
      da.Fill(ds, "tblorderLines"); 
      ds.Relations.Add("orderdetails", ds.Tables["tblOrders"].Columns["orderId"], ds.Tables["tblorderLines"].Columns["ordrNumid"], false); 
     } 
     catch (Exception ex) 
     { throw ex; } 
     finally 
     { conn.Close(); } 

     return ds.Tables["tblProducts"]; 
    } 

    public bool SaveChanges() 
    { 
     try 
     { 
      if (ds.Tables["tblorderLines"].GetChanges() == null) 
       return false; 

      var update = "UPDATE tblorderLines SET ordrNumid= @oni, ordrPrdctid= @opi, ordrQuantity= @oq WHERE ordritmId= @oii"; 
      var cmd = new SqlCommand(update, conn); 

      cmd.Parameters.Add("@oni", SqlDbType.Int, 4, "ordrNumid"); 
      cmd.Parameters.Add("@opi", SqlDbType.Int, 4, "ordrPrdctid"); 
      cmd.Parameters.Add("@oq", SqlDbType.SmallInt, 2, "ordrQuantity"); 
      cmd.Parameters.Add("@oii", SqlDbType.BigInt, 8, "ordritmId").SourceVersion = DataRowVersion.Original; 

      da.UpdateCommand = cmd; 

      da.Update(ds, "tblorderLines"); 
      return true; 
     } 
     catch (Exception ex) 
     { throw ex; } 
    } 
} 

希望我幫助和抱歉,我的英語水平=)

注意還有那些誰不願意看到的表示層中的表,單元或關係的任何名字,所以他們會增加額外的根據需要運行。