Hmm... det tror jeg faktiskt ikke at du kan i dette tilfælde, men jeg er ikke 100% sikker.
Indtil andre svar dukker op kan du overføre din List<> til en DataTable. Men det ville jo være rart at undgå dette step.
#region DataGridView
// Demodata... List<string> cuedStrings = new List<string>(); cuedStrings.Add("Test"); cuedStrings.Add("Test2"); cuedStrings.Add("Test3");
// Én løsning er at smide indholdet over i en DataTable DataTable dataTable = new DataTable(); DataColumn dataColumn = new DataColumn("Text"); dataColumn.Caption = "Text"; dataTable.Columns.Add(dataColumn);
Der hvor du kalder din addString(...) er da din parameter minLabelEllerHvadDenNuHedder.Text ? for ellers vil den kalde ToString! (hvis du har udeladt .Text) og så får du det resultat du har nu!
det ville være fantastisk.... det kan være du lige kan hjælpe mig med hvordan jeg så sletter et felt. Det bliver altid det første felt der skal slettes ....så det burde være rimelig let har årøvet men noget ligne det her
cuedStrings.RemoveAt(0); try { dataTable.Rows.RemoveAt(0); try { dataGridView1.DataSource = dataTable; } } Men jeg fr alle mulige mærkelig popup med at index 1 value is unassigned ...
Desværre er det som jeg formodede, DataGrid & DataGridView databinder kun til properties. Da strenge ikke har properties vil det derfor ikke være muligt. Hvis du vil bruge din generiske liste direkte er du altså nødsaget til at pakke din streng pænt ind i en klasse som eksponerer strengen vha. en property.
men jeg kan af mystiske årsager kun vist den første streng der bliver tilføjet... har tjekket alle strenge ligger cuedStrings hvilket de rigtig nok gør. det næste er jeg stadig får en execption når jeg sletter fra cuedStrings får jeg fejlen DataGridview index out of range execption ...
Har lige siddet og kigget lidt på det.. hvis den første streng bliver slette kommer den næste til også videre så det der vises er næste som fifo kø ... Ved bare ikke hvordan man lige får tilføjet en række når der sættes ind i cuedStrings
Nu er jeg ikke helt med på mere hvad du egentligt gerne vil have. Jeg har vist dig hvorledes du binder en List<string> til en grid. Jeg har også vist dig hvordan du fjerner første element fra denne liste.
Men er dit ønske nu at List<StringClass> skal være unik (ingen duplikater), for umiddelbart ser det ud til at det er det du forsøger.
For at få din cuedStrings.Contains til at virke skal du som minimum override din Equals metode. Man bør dog også implementere ==, !=, <, >. Men det er ikke nødvendigt for at få din kode til at du. (I dette tilfælde)
Prøv følgende:
cuedStrings.Add(new StringClass("123"));
if (cuedStrings.Contains(new StringClass("123"))) { MessageBox.Show("Det virker"); }
Som du vil se får du ingen "Det virker" besked...
Prøv så at tilføre følgende til StringClass:
public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) return false;
StringClass stringClass = obj as StringClass;
return this.text.Equals(stringClass.text); }
Kør dit eksempel igen, hvorefter en MessageBox vil skrive "Det Virker".
Først vil jeg gerne lige takke dig for din kæmpe tålodighed med mig... Jeg har tjekket og fået det til at virker med at der ikke kommer duplikater i listen mit problem er bare at datagrided kun viser den første streng i listen. og his listen bliver tom får jeg fejlen DataGridview index out of range execption ...
Hvis du skal anvende løsningen med List<StringClass> som DataSource, så skal du kun binde denne, EFTER at du har adderet alle dine resultater til listen, og altså ikke som i din kode hvor du binder hver gang du adder et item!
Man kan godt assigne en tom List<T> til DataSource, men så kan den ikke efterfølgende tilskrives uden at få fejl. Man kan så snyde og vente med at binde sin liste indtil det første item er adderet. Derefter kan man addere efterfølgende:
List<StringClass> cuedStrings = new List<StringClass>(); cuedStrings.Add(new StringClass("Test1")); this.dataGridView1.DataSource = cuedStrings;
Men bemærk at valget af den rette løsning afhænger af dine datamængder. Er det et lille antal som blot skal visualiseres, kan du anvende List<T> løsningen (eller anden type af collection) Er det større mængder, bør du klart overveje DataTable løsningen fordi du har mulighed for løbende at opdatere dit UI samtidig med at du indlæser data.
At du kun ser ét item må skyldes noget andet, som jeg ikke kan se ud fra den kodestump.
okay det nu gik roder jeg lidt videre med datatable løsning den første du kom med ... men hvis der er 3 element i datatable og jeg sletter det det jeg sletter nummer 2 for jeg en fejl om index 1 doesn't have a value ...
Problemet med List<T> er at det ikke er bygget til at binde. Der findes dog en BindingList<T> som implementerer IBindingList. Denne kan du binde fint til din grid uden problemer.
this.cuedStrings = new BindingList<StringClass>();
Men uansset hvad. Når du forsøger at slette ved at angive en index value, så bør du først checke om denne eksisterer. Hvis du stadig har problemer så må jeg se noget mere af din kode.
Desuden findes der også en desideret Queue<T> klasse som måske kan have din interesse. Desværre ser det ikke ud til at der er en BindingQueue, så der er man nødt til at lave sin egen som implementerer IBindingList.
kan du som en sidste ting lige fortælle mig hordan jeg sætter en fixed width på en DataColumn ? så hver gang der tilføjes en streng er kolonon 100 bred selv om strengen kun 10 tegn bred
det er bare sådan at størrelse af koloner i mit datagrid ikke ændre sig bare fordi der kommer en længere streng og eller hvis der bliver slettet en lang streng
Nu er du jo så heldig at du ved hvad din property på StringClass hedder, så løsningen er let.
Gå til designeren og tilfør en kolonne til din grid (eller kod det i hånden) Kolonnen skal afspelje det som du ønsker at vise, og i dette tilfælde er det Text propertyen. Så for at binde kolonnen til din StringClass.Text property skal du på kolonnen assigne DataPropertyName med værdien "Text".
Når du har lavet din kolonne kan du ændre et hav af visningsmåder. Du kan også give kolonnen en ny label etc.
Men i dette tilfælde skal du ændre den måde kolonnen resizes. Det gør du ved at vælge en af de muligheder som tilbydes på propertyen AutoSizeMode. Du skal her vælge AllCells som medfører at kolonnen akkurat passer til din tekst.
Koden for kolonnen vil se ud som følger: // // ColumnText // this.ColumnText.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; this.ColumnText.DataPropertyName = "Text"; this.ColumnText.HeaderText = "Text"; this.ColumnText.Name = "ColumnText"; this.ColumnText.ReadOnly = true; this.ColumnText.Width = 53;
...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.