【问题标题】:Master / Detail datagridview with relation from type string in C#与 C# 中类型字符串的关系的主/详细数据网格视图
【发布时间】:2009-02-16 12:45:43
【问题描述】:

我想在 C# 中使用两个数据网格视图和 DataRelation 来显示主/详细关系。

主表和明细表之间的关系是一个字符串类型的ID(并且没有机会将ID更改为整数类型)。

在更改主表中的行时,DataGridView 似乎无法更新详细视图。

有人知道是否可以使用字符串 ID 实现主视图/详细视图,如果可以,如何实现?还是我必须使用其他公司的外部 DataGrid?

我个人认为使用字符串而不是整数没有区别。我唯一能想到的是,网格无法使用字符串 ID 关系处理主详细信息视图。

更新:问题已解决,问题是一个关系来自 nchar 类型并且在字符串末尾有 blancs。感谢您的帮助!

这里是一个例子,请新建一个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.");
        }
    }
}

【问题讨论】:

  • 完全重复 - stackoverflow.com/questions/553098/…。建议关闭问题。用户似乎也为此创建了一个新帐户。
  • @ds1,请阅读 Stackoverflow 常见问题解答以了解发布指南。
  • 嗨 Cerebrus,是的,很抱歉,看起来我无法关闭我以“Daniel”为名的第一篇帖子,因为那时我是匿名用户,请随时关闭第一篇帖子stackoverflow.com/questions/553098/…

标签: c# datagridview datarelation


【解决方案1】:

我查看了您的代码,看起来基本没问题。请尝试进一步修剪它。

但我发现字段名称“strId”有点可疑,这真的是数据库中列的名称吗?

提示:在 Relations.Add(relation) 行上打断并仔细检查关系对象。

代码没有显示 bindinsource 组件的制作地点/方式,可能它们设置了一些设计时属性(过滤器)。

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2011-02-11
    • 2017-12-14
    • 2012-06-07
    • 2011-10-05
    • 2019-05-09
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多