Toon posts:

[c#]Datagridview vullen met 'related' tables

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb twee datatables die uit twee verschillende bronnen komen. De ene is een XML-bestand en de andere een Excel-sheet.
Beide tabellen zitten in een dataset
Tussen deze twee tabellen is een 1-op-1 relatie die ik ook in de dataset heb opgeslagen.

Nu wil ik een DataGridView vullen op een Window Form die de gegevens van beide tabellen laat zien. Maar ik krijg alleen de data van de eerste tabel er in.

Ik heb al met een DefaultViewManager geprobeerd:
C#:
1
DataViewManager dsView = currentDataset.DefaultViewManager;

en met een DataView:
C#:
1
DataView dv = new DataView(currentDataset.Tables[0]);

maar beide met hetzelfde resultaat als
C#:
1
dgvIdentify.DataSource = currentDataset.Tables[0];


De relatie leg ik zo:
C#:
1
2
3
4
DataColumn parentColumn = currentLayerDataTable.Columns[0];
DataColumn childColumn = dataSourceDataTable.Columns[0];
DataRelation rel = new DataRelation("rel" + dataSourceName, parentColumn, childColumn, false);                
dataSetLayer.Relations.Add(rel);


Ergens vergeet ik wat, maar ik kom er niet uit. Ik ben al twee dagen aan het lezen en zoeken. Ik vind wel veel voorbeelden van hierarchische grids maar niets zinnigs over een 1-op-1 relatie.

Graag een duwtje in de goede richting.

Paul

Acties:
  • 0 Henk 'm!

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-09 12:03
Ik heb het een tijdje geleden als volgt gedaan:
C#:
1
2
3
4
5
6
7
8
DataSet data = mData;

DataSet dataXML = DeserializeXMLBlocks(data, XMLBlockBL.Columns.ID.Name, XMLBlockBL.Columns.XML.Name);

data.Tables[0].PrimaryKey = new DataColumn[1] { data.Tables[0].Columns[XMLBlockBL.Columns.ID.Name] };
dataXML.Tables[0].PrimaryKey = new DataColumn[1] { dataXML.Tables[0].Columns[XMLBlockBL.Columns.ID.Name] };

data.Tables[0].Merge(dataXML.Tables[0]);


En dan uiteraard aan de gridvied binden met
C#:
1
gvXML.Datasource = data.Tables[0];


Niet persé een relation, maar een in-memory gemergde dataset, ik las nl. ergens dat een standaard gridview in C# niet overweg kon met dataset met datarelations, je zou dan de ultragrid control, die je moet kopen, moeten gebruiken. Die zou er wel mee overweg kunnen.

Een andere methode heb ik in ieder geval nog niet gevonden... laat even weten of het je hiermee gelukt is?

Edit: de DeserializeXMLBlocks procedure die ik hier geschreven heb doet niets meer dan een Dataset terug geven waarin de XML blocks zijn gedeserialized in een bijpassende dataset waaraan de ID kolom is toegevoegd voor de koppeling tussen de tabellen.

[ Voor 12% gewijzigd door F-Tim op 28-05-2008 10:05 ]

Wanna play?


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:46
F-Tim schreef op woensdag 28 mei 2008 @ 10:01:
ik las nl. ergens dat een standaard gridview in C# niet overweg kon met dataset met datarelations
Een gridview kan prima overweg met relaties, maar niet op deze manier. Wat een GridView wel kan, is bij de selectie in het grid aan de hand van de relatie de child row(s) bepalen en die in een ander control tonen. De enige oplossing voor dit specifieke probleem is inderdaad een nieuwe tabel maken met de "gemergde" data van beide tabellen.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben verder gaan zoeken met de zoektermen merge en datatable en ik kwam twee artikelen tegen:
http://christofr.com/blog/category/c/
http://anuviswan.blogspot...merge-datatable-in-c.html

De genoemde functies heb ik samengevoegd en daarmee werkt het wel.
Inderdaad moet je de twee tabellen handmatig samenvoegen.
Hier is mijn code. Suggesties voor verbeteringen zijn altijd welkom:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private DataTable MergeTables(DataTable dt1, DataTable dt2, string ColumnNameTable1, string ColumnNameTable2)
{

    //Make sure we have some valid data to work with
    if (dt1 == null || dt2 == null || dt1.Columns.Count < 1 || dt1.Columns.Count < 1)
        return null;

    //copy first table to new table
    DataTable dtResults = dt1.Clone();
    dtResults.TableName = "Merged";

    DataColumn[] columns = new DataColumn[dt2.Columns.Count-1];
    int j = 0;
    //Copy columns from Table 2
    foreach (DataColumn dc in dt2.Columns)
    {
        if (!dc.ColumnName.Equals(ColumnNameTable2))
        {
            dtResults.Columns.Add(dc.ColumnName, dc.DataType);
            //Used later on:
            columns[j++] = new DataColumn(dc.ColumnName, dc.DataType);
        }
    }

    dtResults.BeginLoadData();
    foreach (DataRow dr in dt1.Rows)
    {
        dtResults.Rows.Add(dr.ItemArray);
    }
    foreach (DataRow dr in dt2.Rows)
    {
        foreach (DataRow dr1 in dtResults.Rows)
        {
            if (dr1[ColumnNameTable1].ToString().Equals(dr[ColumnNameTable2].ToString()))
            {
                foreach (DataColumn c in columns)
                {
                    if (c != null)
                        dr1[c.ColumnName] = dr[c.ColumnName];
                }
            }
        }
    }
    dtResults.EndLoadData();
    return dtResults;
}