2016-04-12 5 views
2

を追加し、私は、マスタデータがDataGridViewのにバインドされたテキストボックスやその他のコントロールおよび詳細データにバインドされたマスター・ディテール・ウィンドウにバインドデータをロードするために、次のコードを持っている:FORM負荷にWinformsののBindingSourceの問題新しいレコード

DataSet dsOrders = new DataSet("dsOrders"); 

      SqlDataAdapter daOrderHeader;// = new SqlDataAdapter(); 
      SqlDataAdapter daOrderDetail;// = new SqlDataAdapter(); 

      BindingSource bsOrderHeader = new BindingSource(); 
      BindingSource bsOrderDetail = new BindingSource(); 

    DataTable dtOrderHeader = new DataTable("dtOrderHeader"); 
       DataTable dtOrderDetail = new DataTable("dtOrderDetail"); 

       dsOrders.Tables.Add(dtOrderHeader); 
       dsOrders.Tables.Add(dtOrderDetail); 

       daOrderHeader = DataAdapterOrderHeader(); 
       daOrderDetail = DataAdapterOrderDetail(); 

       daOrderHeader.Fill(dtOrderHeader); 
       daOrderDetail.Fill(dtOrderDetail); 

       ////Set up a master-detail relationship between the DataTables 
       DataColumn keyOrderHeaderColumn = dsOrders.Tables["dtOrderHeader"].Columns["ID"]; 
       DataColumn foreignKeyOrderDetailColumn = dsOrders.Tables["dtOrderDetail"].Columns["OrderId"]; 
       dsOrders.Relations.Add("rOrders", keyOrderHeaderColumn, foreignKeyOrderDetailColumn); 

       bsOrderHeader.DataSource = dsOrders; 
       bsOrderHeader.DataMember = "dtOrderHeader"; 
       bsOrderDetail.DataSource = bsOrderHeader; 
       bsOrderDetail.DataMember = "rOrders"; 

tbxOrderNo.DataBindings.Add("Text", bsOrderHeader, "ID"); 
      tbxCustomer.DataBindings.Add("Text", bsOrderHeader, "Name"); 
      tbxTaxRate.DataBindings.Add("Text", bsOrderHeader, "TaxRate"); 
      tbxShipping.DataBindings.Add("Text", bsOrderHeader, "Shipping"); 
      tbxExchangeRate.DataBindings.Add("Text", bsOrderHeader, "ExchangeRate"); 
      dtpOrderDate.DataBindings.Add("Text", bsOrderHeader, "OrderDate"); 
      cbxPriceCode.DataBindings.Add("SelectedIndex", bsOrderHeader, "PriceCode"); 
      dgvItems.DataSource = bsOrderDetail; 

enter code here 

ONは、新しいレコードを追加:

DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow(); 
      drOrderHeader["ID"] = (maxID + 1); 
      dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader); 
      DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow(); 
      drOrderDetail["OrderId"] = (maxID + 1); 
      dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail); 
      bsOrderHeader.DataSource = dsOrders.Tables["dtOrderHeader"]; 
      bsOrderDetail.DataSource = dsOrders.Tables["dtOrderDetail"]; 

私は新しい行の追加]ボタンをクリックした場合、bindingsource.countプロパティは新しいレコードが追加されていることを示しているが、Winフォームの続きロールは同じレコードにとどまり、私は新しく作成されたレコードにスクロールできません。また、bindingsource.movelastは動作を停止しました。

お願いします。必要なのは、新しく追加されたレコード/行をスクロールして、すべてのwinformテキストボックスをクリアし、新しいレコードのデータを入力できる状態にすることです。ボタンが、あなたはすでに見つかったよう

newOrderId = Convert.ToInt32(dsOrders.Tables["dtOrderHeader"].Compute("max(ID)", string.Empty)) + 1; 
      DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow(); 
      drOrderHeader["ID"] = (newOrderId); 
      dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader); 
      DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow(); 
      drOrderDetail["OrderId"] = (newOrderId); 
      dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail); 
      bsOrderHeader.Position = bsOrderHeader.Find("ID", newOrderId); 

答えて

0

成功しなかった、データバインディングを使用すると、基になるデータソースに加えた変更、これ以下の2行を検出:

bsOrderHeader.DataSource = dsOrders.Tables["dtOrderHeader"]; 
bsOrderDetail.DataSource = dsOrders.Tables["dtOrderDetail"]; 

を冗長化しています。そしてそれだけでなく、2番目のものがbsOrderDetailのデータソースタイプを間違って変更します。だから単純に削除してください。新しく追加されたレコードにUIを再バインドするために

、あなたが必要なのは、このような新しいレコードのインデックスにbsOrderHeaderPositionプロパティを設定することです:

bsOrderHeader.Position = bsOrderHeader.Find("ID", drOrderHeader["ID"]); 

とデータバインディングインフラマスターコントロールと(DataRelationを介して)詳細グリッドビューの両方を自動的に再バインドします。

編集:ここでは完全なデモです。更新後にコードが機能しない場合、コードはポストに表示されていない他のコード部分によって引き起こされるはずです。

using System; 
using System.Data; 
using System.Windows.Forms; 

namespace Samples 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      var form = new Form(); 


      DataSet dsOrders = new DataSet("dsOrders"); 

      //SqlDataAdapter daOrderHeader;// = new SqlDataAdapter(); 
      //SqlDataAdapter daOrderDetail;// = new SqlDataAdapter(); 

      BindingSource bsOrderHeader = new BindingSource(); 
      BindingSource bsOrderDetail = new BindingSource(); 

      DataTable dtOrderHeader = new DataTable("dtOrderHeader"); 
      DataTable dtOrderDetail = new DataTable("dtOrderDetail"); 

      dsOrders.Tables.Add(dtOrderHeader); 
      dsOrders.Tables.Add(dtOrderDetail); 

      //daOrderHeader = DataAdapterOrderHeader(); 
      //daOrderDetail = DataAdapterOrderDetail(); 

      //daOrderHeader.Fill(dtOrderHeader); 
      //daOrderDetail.Fill(dtOrderDetail); 
      dtOrderHeader.Columns.Add("ID", typeof(int)); 
      dtOrderHeader.Columns.Add("Name", typeof(string)); 
      dtOrderHeader.Columns.Add("TaxRate", typeof(decimal)); 
      dtOrderHeader.Columns.Add("Shipping", typeof(string)); 
      dtOrderHeader.Columns.Add("ExchangeRate", typeof(decimal)); 
      dtOrderHeader.Columns.Add("OrderDate", typeof(DateTime)); 
      dtOrderHeader.Columns.Add("PriceCode", typeof(int)); 

      dtOrderHeader.PrimaryKey = new[] { dtOrderHeader.Columns["ID"] }; 

      dtOrderDetail.Columns.Add("OrderId", typeof(int)); 
      dtOrderDetail.Columns.Add("Quantity", typeof(decimal)); 

      ////Set up a master-detail relationship between the DataTables 
      DataColumn keyOrderHeaderColumn = dsOrders.Tables["dtOrderHeader"].Columns["ID"]; 
      DataColumn foreignKeyOrderDetailColumn = dsOrders.Tables["dtOrderDetail"].Columns["OrderId"]; 
      var rel = dsOrders.Relations.Add("rOrders", keyOrderHeaderColumn, foreignKeyOrderDetailColumn); 

      bsOrderHeader.DataSource = dsOrders; 
      bsOrderHeader.DataMember = "dtOrderHeader"; 
      bsOrderDetail.DataSource = bsOrderHeader; 
      bsOrderDetail.DataMember = "rOrders"; 

      var splitView = new SplitContainer { Dock = DockStyle.Fill, Parent = form }; 
      var tbxOrderNo = new TextBox(); 
      var tbxCustomer = new TextBox(); 
      var tbxTaxRate = new TextBox(); 
      var tbxShipping = new TextBox(); 
      var tbxExchangeRate = new TextBox(); 
      var dtpOrderDate = new DateTimePicker(); 
      int y = 8; 
      foreach (var c in new Control[] { tbxOrderNo, tbxCustomer, tbxTaxRate, tbxShipping, tbxExchangeRate, dtpOrderDate }) 
      { 
       c.Top = y; 
       c.Left = 16; 
       splitView.Panel1.Controls.Add(c); 
       y = c.Bottom + 8; 
      } 

      var dgvItems = new DataGridView { Dock = DockStyle.Fill, Parent = splitView.Panel2 }; 

      tbxOrderNo.DataBindings.Add("Text", bsOrderHeader, "ID"); 
      tbxCustomer.DataBindings.Add("Text", bsOrderHeader, "Name"); 
      tbxTaxRate.DataBindings.Add("Text", bsOrderHeader, "TaxRate"); 
      tbxShipping.DataBindings.Add("Text", bsOrderHeader, "Shipping"); 
      tbxExchangeRate.DataBindings.Add("Text", bsOrderHeader, "ExchangeRate"); 
      dtpOrderDate.DataBindings.Add("Text", bsOrderHeader, "OrderDate"); 
      //cbxPriceCode.DataBindings.Add("SelectedIndex", bsOrderHeader, "PriceCode"); 
      dgvItems.DataSource = bsOrderDetail; 


      Func<DataRow> addOrder =() => 
      { 
       var maxOrderId = dsOrders.Tables["dtOrderHeader"].Compute("max(ID)", string.Empty); 
       int newOrderId = (maxOrderId != null && maxOrderId != DBNull.Value ? Convert.ToInt32(maxOrderId) : 0) + 1; 
       DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow(); 
       drOrderHeader["ID"] = newOrderId; 
       dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader); 
       DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow(); 
       drOrderDetail["OrderId"] = newOrderId; 
       dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail); 
       return drOrderHeader; 
      }; 

      for (int i = 0; i < 5; i++) addOrder(); 

      var addButton = new Button { Dock = DockStyle.Bottom, Parent = form, Text = "Add" }; 
      addButton.Click += (sender, e) => 
      { 
       var drOrderHeader = addOrder(); 
       bsOrderHeader.Position = bsOrderHeader.Find("ID", drOrderHeader["ID"]); 
      }; 

      Application.Run(form); 
     } 
    } 
} 
+0

イワン、私を助けてくれてありがとう。私は自分のコードを変更しましたが(UPDATE参照)、同じ結果が得られます。追加ボタンをクリックした後のレコードにとどまり、bsOrderHeader.MoveLastも機能しなくなります。 – superconsultant

+0

それは変です。編集を参照し、図示されていないコードをチェックしてください。 –

+0

ありがとうIvan、それは働いた。私はまた別の問題を抱えていました。私のフォームのコントロールの1つは、チェックボックスともう1つのコンボボックスで、DataTableにデフォルト値を設定する必要があります( 'dtOrderHeader.Columns [" Paid "]。DefaultValue = 0; dtOrderHeader .Columns ["PriceCode"]。DefaultValue = 0; ')私がそれを修正するまで、バインディングソースのナビゲーションを破っていて、新しく追加されたレコードにスクロールしませんでした。とにかく、もう一度感謝して、私はあなたの助けを非常に感謝します。 – superconsultant

関連する問題