Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > 2 грида и 2 таблицы


Автор: Bogdan1024 20.4.2009, 19:49
Есть датасет:
Код

    public static class Class1
    {
        public static System.Data.DataSet GetDataSet()
        {
            System.Data.DataSet ds = new System.Data.DataSet("ds");
            System.Data.DataTable t1 = new System.Data.DataTable("t1");
            System.Data.DataColumn c1 = new System.Data.DataColumn("c1", typeof(int));
            System.Data.DataColumn c2 = new System.Data.DataColumn("c2", typeof(string));
            t1.Columns.Add(c1);
            t1.Columns.Add(c2);
            ds.Tables.Add(t1);
            System.Data.DataTable t2 = new System.Data.DataTable("t2");
            System.Data.DataColumn c3 = new System.Data.DataColumn("c3", typeof(int));
            System.Data.DataColumn c4 = new System.Data.DataColumn("c4", typeof(string));
            t2.Columns.Add(c3);
            t2.Columns.Add(c4);
            ds.Tables.Add(t2);
            t1.Rows.Add(1, "1");
            t1.Rows.Add(2, "2");
            t2.Rows.Add(1, "1-1");
            t2.Rows.Add(1, "1-2");
            t2.Rows.Add(2, "2-1");
            t2.Rows.Add(2, "2-2");
            return ds;
        }
    }

есть 2 грида
один показывает содержимое t1
второй показывает просто содержимое t2
Код

            System.Data.DataSet ds = Class1.GetDataSet();
            this.dataGridView1.DataSource = ds;            
            this.dataGridView1.DataMember = "t1";
            this.dataGridView2.DataSource = ds;
            this.dataGridView2.DataMember = "t2";

но второй должен показывать содержимое t2, для которого t1.c1 == t2.c3
как это лучше сделать?
код везде можно менять ;)

Добавлено через 1 минуту и 42 секунды
Пытался сделать так (прочитал кое-где что так можно):
в коде создания датасэта:
Код

            ds.Relations.Add(new System.Data.DataRelation("r1", c1, c3, true));

в коде формы:
Код

    this.dataGridView2.DataMember = "r1";//имя Relation'a

но не работает так

Автор: Ctrl 21.4.2009, 19:10
Вот кусок кода, выдранный из юнит-тестов, который делает то что тебе надо
Фишка в синтаксисе имени детальной таблицы:
...
 detailGrid.DataMember = "MasterTable.Relation"; 
...


Код

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

namespace MasterDetail.Test {
    public partial class FormWithMasterDetailGrids : Form {
        public FormWithMasterDetailGrids() {
            InitializeComponent();
            BindGridsToData(masterGrid, detailGrid, CreateData(5, 5));
        }
        void BindGridsToData(DataGridView masterGrid, DataGridView detailGrid, DataSet dataSet) {
            masterGrid.DataSource = dataSet;
            masterGrid.DataMember = "MasterTable";
            detailGrid.DataSource = dataSet;
            detailGrid.DataMember = "MasterTable.Relation"; 
        }
        DataSet CreateData(int numMaster, int numDetail) {
            DataSet dataSet = new DataSet("TestData");
            DataTable masterTable = dataSet.Tables.Add("MasterTable");
            DataTable detailTable = dataSet.Tables.Add("DetailTable");
            //
            DataColumn colID = masterTable.Columns.Add("ID", typeof(int));
            DataColumn colName = masterTable.Columns.Add("Name", typeof(string));
            //
            DataColumn colID1 = detailTable.Columns.Add("ID", typeof(int));
            DataColumn colMasterID = detailTable.Columns.Add("MasterID", typeof(int));
            DataColumn colName1 = detailTable.Columns.Add("Name", typeof(string));
            //
            dataSet.Relations.Add("Relation", colID, colMasterID, true);
            //
            GenerateData(numMaster, numDetail, masterTable, detailTable);
            return dataSet;
        }
        void GenerateData(int numMaster, int numDetail, DataTable masterTable, DataTable detailTable) {
            for(int masterId = 0; masterId < numMaster; masterId++) {
                masterTable.Rows.Add(masterId, "MasterRecord" + masterId.ToString());
                for(int i = 0; i < numDetail; i++) {
                    int detailId = masterId * 100 + i;
                    detailTable.Rows.Add(detailId, masterId, "DetailRecord" + detailId.ToString());
                }
            }
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)