Utilizarea unei liste ca sursă de date pentru DataGridView (Programare, C#, Datagridview, Datasource, Icollection, Ordereddictionary)

tf.rz a intrebat.

Am extras numele setărilor și valorile lor respective dintr-un fișier de configurare într-un dicționar ordonat. Dicționarul conține chei și valori care sunt din clasa ICollection. Vreau să leg aceste date și să le afișez într-un DataGridView. Am încercat să copiez șirurile de caractere în array-uri și să afișez acele array-uri, dar când am rulat programul, coloanele erau goale și nu părea să fie deloc legat.

Am încercat, de asemenea, să setez sursa DataGridView direct pe una dintre colecțiile dicționarului ordonat (chei sau valori), dar nici asta nu a avut ca rezultat ceea ce doream; coloanele erau în continuare goale. Cu toate acestea, o a treia coloană este realizată cu numele coloanei ca „length” și afișează lungimile intrărilor din ICollection. Dar nu mai este nevoie să spun că nu vreau lungimile, ci intrările în sine.

Iată codul pe care îl folosesc pentru această întrebare: La încărcarea formularului, încarc fișierul de configurare, iar un membru privat numit m_Settings conține toate perechile cheie-valoare. Apoi creez o listă și adaug cheile și valorile separat. După ce am setat sursa de legare la „data”, execut programul și ambele coloane pe care le-am adăugat sunt ambele goale.

    private void Form4_Load(object sender, EventArgs e)
    {
        loadconfigfile(Properties.Settings.Default.Config);
        List<Object> data = new List<Object>();
        data.Add(m_Settings.Keys);
        data.Add(m_Settings.Values);
        bindingSource1.DataSource = data;
        dataGridView1.DataSource = bindingSource1;
        dataGridView1.Refresh();
    }

Aveți vreo idee despre cum aș putea obține dicționarul ordonat și să afișez intrările în două coloane denumite „Settings” și „Values”? Cred că listele erau DataSources compatibile pentru DataGridViews, dar acum încep să mă îndoiesc.

Orice ajutor sau direcție este foarte apreciată! Voi fi bucuros să vă ofer mai multe informații dacă este nevoie.

Vă mulțumesc!

EDITARE:

Iată codul revizuit cu clasa myStruct implementată:

    List<myStruct> list = new List<myStruct>();
    for(int index = 0; index < m_Settings.Count; index++)
    {
        myStruct pair = new myStruct(keys[index], values[index].ToString());
        list.Add(pair);
    }

    public class myStruct
    {
        private string Key { get; set; }
        private string Value { get; set; }

        public myStruct(string key, string value)
        {
            Key = key;
            Value = value;
        }
    }

Cu toate acestea, atunci când setez DataDource binding la list, nu apare nimic pe DataGridView, este pur și simplu gol. Știe cineva de ce?

Comentarii

  • Codul de mai sus chiar funcționează pentru dumneavoastră? Eu l-am încercat, dar nu a funcționat până când nu am schimbat Key și Value în public (așa cum sunt în răspunsul acceptat…) –  > Por obe.
  • @obe Nu a funcționat la momentul respectiv, a fost un cod bazat pe o sugestie din răspunsurile pe care le-am primit. Răspunsul este cel care funcționează de fapt. –  > Por tf.rz.
3 răspunsuri
MBen

În primul rând, nu înțeleg de ce adăugați toate cheile și valorile de nenumărate ori, Index nu este niciodată folosit.

Am încercat acest exemplu :

        var source = new BindingSource();
        List<MyStruct> list = new List<MyStruct> { new MyStruct("fff", "b"),  new MyStruct("c","d") };
        source.DataSource = list;
        grid.DataSource = source;

și care funcționează destul de bine, obțin două coloane cu numele corecte. Tipul MyStruct expune proprietăți pe care mecanismul de legare le poate folosi.

    class MyStruct
   {
    public string Name { get; set; }
    public string Adres { get; set; }


    public MyStruct(string name, string adress)
    {
        Name = name;
        Adres = adress;
    }
  }

Încercați să construiți un tip care să ia o cheie și o valoare și să le adăugați una câte una.Sper să vă fie de ajutor.

Comentarii

  • @MBen: Ah, da, am observat asta chiar după ce am postat, scuzele mele. Mulțumesc pentru contribuția ta, voi implementa ceva similar și te voi anunța cum merge. –  > Por tf.rz.
  • @MBen: Bună ziua din nou! Am implementat ceva asemănător, așa cum ai sugerat, te rog să arunci o privire la editare. Datagridview-ul este însă, din păcate, încă gol. Mi-a scăpat ceva? –  > Por tf.rz.
  • păi da, ar trebui să treci ca valoare de pereche. Ceea ce faci este să adaugi cheile, apoi să adaugi valorile, cum știe că vrei să ai o coloană Cheie, coloană valoare. În exemplul meu am înfășurat șirul de caractere cu o clasă și am declarat proprietăți publice. În exemplul meu, puteți înlocui șirul de caractere nume cu KeyType key și șirul adresă cu ValueType. Și trebuie să parcurgeți în buclă toate cheile și valorile și să adăugați noua structură una câte una. –  > Por MBen.
  • Nu, ar trebui să creați un tip care să aibă două proprietăți, una care să expună cheia și una care să expună valoarea. Class KeyValueClass { public KeyType Key {get;set;} public YourValuetype Value {get;set;} } apoi adăugați această clasă în listă, una câte una. –  > Por MBen.
  • @MBen: Am înțeles! Acum funcționează pe deplin. mulțumesc foarte mult pentru ajutor și îndrumare. Să aveți o zi minunată! =) –  > Por tf.rz.
Yamanappa

Setați proprietatea DataGridView

    gridView1.AutoGenerateColumns = true;

Și asigurați-vă că lista de obiecte pe care le legați, proprietățile acestor obiecte trebuie să fie publice.

naqib

Această funcție vă poate ajuta. adaugă fiecare obiect de listă la vizualizarea grilă.

private void show_data()
        {
            BindingSource Source = new BindingSource();

            for (int i = 0; i < CC.Contects.Count; i++)
            {
                Source.Add(CC.Contects.ElementAt(i));
            };


            Data_View.DataSource = Source;

        }

Scriu acest lucru pentru o aplicație simplă de bază de date