「クライアント」のテーブルと「予約」のテーブルを含む DataSet があります。2 つの「ClientsBookings」の間に DataRelation が設定されています。
Clients テーブルを親フォームの DataGridView にバインドしました。行をダブルクリックすると、選択したクライアントの新しい子フォームが開き、クライアントの詳細と関連する予約が表示されます。
現時点では、新しいフォームはそれぞれ、親フォームの現在のアイテムにバインドされているようです。したがって、親テーブルの行が変更されると、開いているすべての子フォームの現在のアイテムも変更されます。子フォームで新しい BindingSource を作成し、その位置を設定すると、現在のアイテムが親フォームのバインディング ソースから独立するようになると思いました (うまくいきませんでした)。
現在、「ClientsBookings」リレーションを使用して、子フォームで 2 つの BindingSources を連鎖させています。これにより、現在のクライアントに関連する予約のみが子フォームに表示されます。代わりに DataRow などを渡すと、これと同じ効果を得る方法がわかりません。
とにかく、これまでのコードは次のとおりです。
親フォーム:
public partial class ClientsSearchForm : Form
{
BindingSource bsClients = new BindingSource();
private void ClientsSearchForm_Load(object sender, EventArgs e)
{
DataSet clientsDataSet = GetDataSet();
bsClients.DataSource = myDataSet;
bsClients.DataMember = "Clients";
dataGridView1.DataSource = bsClients;
this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
ClientForm form = new ClientForm(bsClients);
form.Show();
}
}
子フォーム:
public partial class ClientForm : Form
{
private BindingSource bsClients = new BindingSource();
private BindingSource bsBookings = new BindingSource();
public ClientForm()
{
InitializeComponent();
}
public ClientForm(BindingSource bsClients)
{
private BindingSource bsClients = new BindingSource();
private BindingSource bsBookings = new BindingSource();
public ClientForm(BindingSource bs)
{
InitializeComponent();
// set up client binding source
// Note: intent is to have this form associated with only one client
// and not change when the selection on the search forlm changes.
this.bsClients.DataSource = bs.DataSource;
this.bsClients.DataMember = bs.DataMember;
this.bsClients.Position = bs.Position;
// set up bookings binding source
this.bsBookings.DataSource = this.bsClients;
this.bsBookings.DataMember = "ClientsBookings";
// set up control bindings
textBox1.DataBindings.Add("Text", bsClients, "Given Name");
dataGridView1.DataSource = bsBookings;
}
}