0

C# で 2 つの datagridviews と DataRelation を使用して、マスター/詳細の関係を表示したいと考えています。

マスター テーブルとディテール テーブルの間の関係は、文字列型の ID です (ID を整数型に変更する機会はありません)。

マスターテーブルの行を変更するときに、DataGridView が詳細ビューを更新できないようです。

文字列 ID を使用してマスター/詳細ビューを実現できるかどうかを知っている人はいますか? または、別の会社の外部 DataGrid を使用する必要がありますか?

個人的には、整数の代わりに文字列を使用することに違いはありません。私が考えることができる唯一のことは、グリッドが文字列 ID リレーションを使用してマスター詳細ビューを処理できないということです。

更新: 問題は解決されました。問題は、1 つの関係が nchar 型からのもので、文字列の末尾に空白があることでした。助けてくれてありがとう!

以下に例を示します。新しい VS 2008 プロジェクトを作成し、コードをコピーしてください。接続文字列とデータ関係を変更します。

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

public class Form1 : System.Windows.Forms.Form
{
    private DataGridView masterDataGridView = new DataGridView();
    private BindingSource masterBindingSource = new BindingSource();
    private DataGridView detailsDataGridView = new DataGridView();
    private BindingSource detailsBindingSource = new BindingSource();

    [STAThreadAttribute()]
    public static void Main()
    {
        Application.Run(new Form1());
    }

    // Initializes the form.
    public Form1()
    {
        masterDataGridView.Dock = DockStyle.Fill;
        detailsDataGridView.Dock = DockStyle.Fill;

        SplitContainer splitContainer1 = new SplitContainer();
        splitContainer1.Dock = DockStyle.Fill;
        splitContainer1.Orientation = Orientation.Horizontal;
        splitContainer1.Panel1.Controls.Add(masterDataGridView);
        splitContainer1.Panel2.Controls.Add(detailsDataGridView);

        this.Controls.Add(splitContainer1);
        this.Load += new System.EventHandler(Form1_Load);
        this.Text = "DataGridView master/detail demo";
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Bind the DataGridView controls to the BindingSource
        // components and load the data from the database.
        masterDataGridView.DataSource = masterBindingSource;
        detailsDataGridView.DataSource = detailsBindingSource;
        GetData();

        // Resize the master DataGridView columns to fit the newly loaded data.
        masterDataGridView.AutoResizeColumns();

        // Configure the details DataGridView so that its columns automatically
        // adjust their widths when the data changes.
        detailsDataGridView.AutoSizeColumnsMode =
            DataGridViewAutoSizeColumnsMode.AllCells;
    }

    private void GetData()
    {
        try
        {
            // Specify a connection string. Replace the given value with a 
            // valid connection string for a Northwind SQL Server sample
            // database accessible to your system.
            String connectionString =
                "";
            SqlConnection connection = new SqlConnection(connectionString);


            // Create a DataSet.
            DataSet data = new DataSet();
            data.Locale = System.Globalization.CultureInfo.InvariantCulture;

            // Add data from the Customers table to the DataSet.
            SqlDataAdapter masterDataAdapter = new
                SqlDataAdapter("select * from customers", connection);
            masterDataAdapter.Fill(data, "Customers");

            // Add data from the Orders table to the DataSet.
            SqlDataAdapter detailsDataAdapter = new
                SqlDataAdapter("select * from orders", connection);
            detailsDataAdapter.Fill(data, "Orders");

            // Establish a relationship between the two tables.
            DataRelation relation = new DataRelation("CustomersOrders",
                data.Tables["Customers"].Columns["strID"],
                data.Tables["Orders"].Columns["strID"]);
            data.Relations.Add(relation);

            // Bind the master data connector to the Customers table.
            masterBindingSource.DataSource = data;
            masterBindingSource.DataMember = "Customers";

            // Bind the details data connector to the master data connector,
            // using the DataRelation name to filter the information in the 
            // details table based on the current row in the master table. 
            detailsBindingSource.DataSource = masterBindingSource;
            detailsBindingSource.DataMember = "CustomersOrders";


        }
        catch (SqlException)
        {
            MessageBox.Show("To run this example, replace the value of the " +
                "connectionString variable with a connection string that is " +
                "valid for your system.");
        }
    }
}
4

1 に答える 1

0

私はあなたのコードを調べましたが、基本的には問題ないようです。ただし、もう少しトリミングしてみてください。

しかし、フィールド名「strId」は少し疑わしいと思います。それは本当にデータベースで列が呼ばれているものですか?

ヒント: Relations.Add(relation) 行を改行して、関係オブジェクトを注意深く調べます。

このコードは、bindinsource コンポーネントがどこでどのように作成されるかを示していません。おそらく、いくつかのデザインタイム プロパティが設定されています (フィルター)。

于 2009-02-16T15:25:19.083 に答える