1

「クライアント」のテーブルと「予約」のテーブルを含む 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;
    }
}
4

0 に答える 0