---
title: "DataGridView och Nästlade objekt."
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/174036-datagridview-och-nästlade-objekt"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Fredde Mannen"
published: "2008-09-13T21:40:05.000Z"
updated: "2008-09-15T06:09:12.000Z"
replies: 11
views: 619
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/174036-datagridview-och-nästlade-objekt"
---

# DataGridView och Nästlade objekt.

## #1 — Fredde Mannen, 2008-09-13T21:40Z

Ger lite av min kod som berörs i frågan. 

```
     public void ReloadEmployeeGrid()
        {
            EmployeeRepository emprepo = new EmployeeRepository();
            IList<IEmployee> employees = emprepo.GetAll();

            BindingSource datasource = new BindingSource();
            datasource.DataSource = employees;

            // fixa grejjerna för employee grid.
            employeeGrid.EditMode = DataGridViewEditMode.EditProgrammatically;
            employeeGrid.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.employeeGrid_CellFormatting);
            employeeGrid.RowHeaderMouseClick += new DataGridViewCellMouseEventHandler(employeeGrid_RowHeaderMouseClick);
            employeeGrid.DataSource = datasource;

            // Våra kolumner som skall synas, förutom stanardkolumnen förnamn.
            employeeGrid.Columns.Add("User", "Användarnamn");
            employeeGrid.Columns.Add("Name", "Efternamn");

            // propertyn,key
            employeeGrid.Columns[0].HeaderText = "Id";
            employeeGrid.Columns[0].DataPropertyName = "key";

            // property User. 
            employeeGrid.Columns[1].HeaderText = "Användarnamn";
            employeeGrid.Columns[1].DataPropertyName = "User.Username";

            // property, Name.First
            employeeGrid.Columns[2].HeaderText = "Förnamn";
            employeeGrid.Columns[2].DataPropertyName = "Name.First";

            // property, Name.Last
            employeeGrid.Columns[3].DataPropertyName = "Name.Last";
        }
```

```
   private void btnSave_Click(object sender, EventArgs e)
        {

            if (boxKey.Text == "")
            {
                Factory factory = new Factory("Employee");
                IEmployee employee = (IEmployee)factory.CreateInstance();

                employee.Name.First = boxFirstname.Text;
                employee.Name.Last = boxLastname.Text;
                employee.User.Username = boxUsername.Text;
                employee.User.Password = boxPassword.Text;
                employee.User.Accesslevel = GetRadiovalue();

                EmployeeRepository emprepo = new EmployeeRepository();
                emprepo.SaveOrUpdate(employee);

                ReloadEmployeeGrid();
            }
            else
            {
                // not implemented..
            }
        }
```

Allt funkar fint, den läser in min lista med objekt, lägger saker där de skall ligga, men när jag kör min btnSave_OnClick, som lägger till information i en databas, det funkar fint, den lägger till infon i databasen. Men när jag skall repopulate datagridview så får jag problem..

OM det normalt skall presenteras som:

> Id \| Användarnamn \| Förnamn \| Efternamn

Så blir det i stället

> Id \| Användarnamn \| Förnamn \| Efternamn \| Name \| User

I dont understand why.. det måste dock ha något med min ReloadEmployeeGrid att göra.

Säg till om ni behöver employeeGrid_CellFormatting, också.

Permalänk: https://www.webforum.nu/p/174036

## #2 — CatZ, 2008-09-13T21:53Z

Cell Formatting är helt ointressant i det här läget. Problemet är hur du refererar till cellerna.

Kör du med databindning eller binder du på DataGridViewColumn."Name"?

//RED hittade BindingSource

Hade samma problem som dig tidigare. Jag löste det inte på det viset som du har tänkt dig utan jag gick in i Designern och skapade min skit där. Har inte lyckats binda korrekt på DataGridViewColumn."Name" annat än om det är samma namn som kommer från databasen. Dvs när jag försökte byta namn på en kolumn så var värdet på det svenska tomt och jag fick en engelsk kolumn extra med värdet istället.

Jag tror det ska gå att stänga av den automatiska tillägget av kolumner så att man tvingar att bara ta emot de med "rätt" namn. Kollegan gjorde så att han körde svenska namn på det som kom från databasen för att slippa problemet men det är en otäck fullösning och jag borde kanske inte nämnt den? :)

Permalänk: https://www.webforum.nu/p/2141523

## #3 — Fredde Mannen, 2008-09-14T08:21Z

Baah.. tusan vad man känner sig förhindrad att göra saker när man suttit med ASP.NET tidigare. :l

Det var ingen lätt match detta, må jag säga.. inte för mig i alla fall..

Permalänk: https://www.webforum.nu/p/2141541

## #4 — CatZ, 2008-09-14T08:47Z

Såhär ser det ut när jag tittar lite närmare. När du kör repopulate på griden så lägger du till två kolumner som hamnar sist och de heter 

```
employeeGrid.Columns.Add("User", "Användarnamn");
            employeeGrid.Columns.Add("Name", "Efternamn");
```

Sedan försöker du sätta värden i kolumnerna men du accessar dom via index och eftersom du accessar dom via index så har du inte en aning om det faktiskt är rätt kolumner ;)

Om du loppar igenom din ColumnCollection så är jag rätt säker på att du kommer inse att du ska ta bort de två raderna jag nämnde tidigare eftersom de hamnar sist varje gång du kör repopulate?

Permalänk: https://www.webforum.nu/p/2141545

## #5 — Nickemannen, 2008-09-14T08:47Z

Inte för att det har med ämnet att göra men jag är lite nyfiken på vad din Factory har för syfte? :)

```
              Factory factory = new Factory("Employee");
                IEmployee employee = (IEmployee)factory.CreateInstance();
```

Permalänk: https://www.webforum.nu/p/2141546

## #6 — Fredde Mannen, 2008-09-14T11:09Z

> **Nickemannen skrev:**
>
> Inte för att det har med ämnet att göra men jag är lite nyfiken på vad din Factory har för syfte? :)
> 
>
>
> ```
>               Factory factory = new Factory("Employee");
>                 IEmployee employee = (IEmployee)factory.CreateInstance();
> ```

Förtillfället har den inte så stort syfte mer än returnera beroende på konstruktorns input en instans av ett objekt, där referensen till typen återfinns i en config-fil. 

Handlar lite grann om att pröva på att skriva olika saker för att lära sig.. det är juuuu så svårt att hitta saker att programmera för skojsskull .. sen om ex. Factoryn funkar som en factory skall fungera enligt factory pattern. Är en annan sak! :OO 

Iofs lite svårt att hitta BRA tutorials om factory pattern 

De flesta säger i stort sett: 

Abstract factory -\> ConcreteFactory -\> Product

Permalänk: https://www.webforum.nu/p/2141554

## #7 — Fredde Mannen, 2008-09-14T11:13Z

Iofs ang. mitt problem, undra om jag skulle använda en listview i stället.. kan det bli lättare att använda för att lösa det där underliga problemet.

Permalänk: https://www.webforum.nu/p/2141555

## #8 — Nickemannen, 2008-09-14T12:30Z

// Våra kolumner som skall synas, förutom stanardkolumnen förnamn.
            employeeGrid.Columns.Add("User", "Användarnamn");
            employeeGrid.Columns.Add("Name", "Efternamn");

Du gör detta varje gång som du laddar om din lista, varför?
Defineringen av kolumnerna bör väl bara göras en gång?

Permalänk: https://www.webforum.nu/p/2141565

## #9 — Nickemannen, 2008-09-14T12:44Z

```
public void InitializeEmployeeGrid(){
{
        // fixa grejjerna för employee grid.
        employeeGrid.EditMode = DataGridViewEditMode.EditProgrammatically;
        employeeGrid.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(  this.employeeGrid_CellFormatting);
        employeeGrid.RowHeaderMouseClick += new DataGridViewCellMouseEventHandler(employeeGrid_RowHeaderMouseClick);

        // Våra kolumner som skall synas, förutom stanardkolumnen förnamn.
        employeeGrid.Columns.Add("User", "Användarnamn");
        employeeGrid.Columns.Add("Name", "Efternamn");

        // propertyn,key
        employeeGrid.Columns[0].HeaderText = "Id";
        employeeGrid.Columns[0].DataPropertyName = "key";

        // property User. 
        employeeGrid.Columns[1].HeaderText = "Användarnamn";
        employeeGrid.Columns[1].DataPropertyName = "User.Username";

        // property, Name.First
        employeeGrid.Columns[2].HeaderText = "Förnamn";
        employeeGrid.Columns[2].DataPropertyName = "Name.First";

        // property, Name.Last
        employeeGrid.Columns[3].DataPropertyName = "Name.Last";
}

public void RefreshEmployeeGrid()
{
        EmployeeRepository emprepo = new EmployeeRepository();
        IList<IEmployee> employees = emprepo.GetAll();

        BindingSource datasource = new BindingSource();
        datasource.DataSource = employees;

        employeeGrid.DataSource = datasource;
}
```

Sedan för att inte ladda om allt från databasen för varje tillläggning av Employee så kanske du bör lägga till den nya i listan istället dvs att du binder bara en gång och arbetar mot listan och repositoryn istället för hela tiden repositoryn.

Permalänk: https://www.webforum.nu/p/2141566

## #10 — Fredde Mannen, 2008-09-14T18:21Z

Moa ha ha.. 

jo det där löste ju en del saker, men detta var det bästa av allt:

```
employeeGrid.AutoGenerateColumns = false;
```

Permalänk: https://www.webforum.nu/p/2141627

## #11 — CatZ, 2008-09-14T19:40Z

jamen det var ju för fan det jag skrev i första inlägget! :)

/RED nej det råkade jag nog ta bort när jag redigerade inlägget hehe

Permalänk: https://www.webforum.nu/p/2141652

## #12 — Fredde Mannen, 2008-09-15T06:09Z

> **CatZ skrev:**
>
> jamen det var ju för fan det jag skrev i första inlägget! :)
> 
> /RED nej det råkade jag nog ta bort när jag redigerade inlägget hehe

Får tacka i alla fall.. :) 

Nåja nu var den biffen välstekt och uppäten, och jag kan gå vidare i min lekvärld. :e

Permalänk: https://www.webforum.nu/p/2141697

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/174036-datagridview-och-nästlade-objekt
