webForumDet fria alternativet

DataGridView och Nästlade objekt.

.NET

11 svar · 597 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

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å.

Medlem sedan jan. 20022 440 inlägg
#2

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? :)

Medlem sedan nov. 20014 054 inlägg
#3

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..

Medlem sedan jan. 20022 440 inlägg
#4

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?

Medlem sedan aug. 20003 575 inlägg
#5

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();
Medlem sedan nov. 20014 054 inlägg
#6

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

Medlem sedan nov. 20014 054 inlägg
#7

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.

Medlem sedan aug. 20003 575 inlägg
#8

// 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?

Medlem sedan aug. 20003 575 inlägg
#9
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.

Medlem sedan nov. 20014 054 inlägg
#10

Moa ha ha..

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

employeeGrid.AutoGenerateColumns = false;
Medlem sedan jan. 20022 440 inlägg
#11

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

Medlem sedan nov. 20014 054 inlägg
#12

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

271 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)