Programmering avanserte Winforms i C #

I denne C # programmeringsopplæringen vil jeg konsentrere meg om de avanserte kontrollene som ComboBoxes, Grids og ListViews og vise deg hvordan du mest sannsynlig vil bruke dem. Jeg berører ikke data og bind før en senere opplæring. La oss begynne med en enkel kontroll, en ComboBox.

I hjertet av en kombinasjonsboksen er en gjenstandssamling, og den enkleste måten å befolke dette på er å slippe en kombinasjonsbokse på skjermen, velg egenskaper (hvis du ikke kan se egenskapsvinduene, klikker du på Vis på toppmenyen og deretter Egenskapsvindu), finner elementer og klikker på ellipsene knapp. Du kan deretter skrive inn strengene, kompilere programmet og trekke kombinasjonsboksen for å se valg.

Nå stopper programmet og legg til noen flere tall: fire, fem.. opp til ti. Når du kjører den, vil du bare se 8 fordi det er standardverdien til MaxDropDownItems. Sett den til 20 eller 3, og kjør den for å se hva den gjør.

Det er irriterende at når det åpnes står det comboBox1, og du kan redigere det. Det er ikke det vi ønsker. Finn DropDownStyle-egenskapen og endre DropDown til DropDownList. (Det er en kombinasjon!). Nå er det ingen tekst, og den er ikke redigerbar. Du kan velge et av tallene, men det åpnes alltid tomt. Hvordan velger vi et nummer til å begynne med? Vel, det er ikke en egenskap du kan angi på designtidspunktet, men å legge til denne linjen vil gjøre det.

instagram viewer

Legg til den linjen i Form1 () -konstruktøren. Du må se koden for skjemaet (høyreklikk på From1.cs i Solution Explorer og klikk på Vis kode). Finn InitializeComponent (); og legg til den linjen umiddelbart etter dette.

Hvis du setter DropDownStyle-egenskapen for kombinasjonsboksen til Simple og kjører programmet, får du ingenting. Den vil ikke velge eller klikke eller svare. Hvorfor? For på designtidspunktet må du ta tak i det nedre strekkhåndtaket og gjøre hele kontrollen høyere.

I eksempel 2 har jeg gitt nytt navn til ComboBox til combo, endret combo DropDownStyle tilbake til DropDown slik at den kan redigeres og lagt til en Legg til-knapp som heter btnAdd. Jeg har dobbeltklikket på legg-knappen for å opprette en hendelse btnAdd_Click () hendelsesbehandler og lagt til denne hendelseslinjen.

Når du kjører programmet, skriver du inn et nytt nummer, si Eleven og klikker på legg til. Arrangementsbehandleren tar teksten du skrev inn (i kombinasjonsboksen). Tekst) og legger den til i combo-varesamlingen. Klikk på Combo og vi har nå en ny post Elleve. Det er slik du legger til en ny streng til en kombinasjonsboksen. Å fjerne en er litt mer komplisert ettersom du må finne indeksen til strengen du ønsker å fjerne og deretter fjerne den. Metoden RemoveAt vist nedenfor er en innsamlingsmetode for å gjøre dette. du trenger bare å spesifisere hvilket element i Fjernindex-parameteren.

vil fjerne strengen i posisjon RemoveIndex. Hvis det er n elementer i kombinasjonsboksen, er de gyldige verdiene 0 til n-1. For 10 elementer er verdiene 0..9.

Hvis dette ikke finner teksten returnerer det -1 ellers returnerer det 0-basert indeks for strengen i kombinasjonslisten. Det er også en overbelastet metode for FindStringExact som lar deg spesifisere hvor du starter søket fra, slik at du kan hoppe over den første osv. Hvis du har duplikater. Dette kan være nyttig for å fjerne duplikater i en liste.

Hvis du klikker på btnAddMany_Click (), fjernes teksten fra kombinasjonsboksen og tømmer innholdet i kombinasjonsboksen. AddRange (for å legge til strengene fra verdisamfunnet. Etter å ha gjort dette, setter den kombinasjonsboksen SelectedIndex til 0. Dette viser det første elementet i kombinasjonsboksen. Hvis du legger til eller sletter elementer i en ComboBox, er det best å følge med på hvilket element som er valgt. Innstilling av SelectedIndex til -1 skjuler de valgte elementene.

Knappen Legg til masse tømmer listen og legger til 10.000 tall. Jeg har lagt til kombinasjonsboksen. StartUpdate () og combo, EndUpdate () ringer rundt løkken for å forhindre at flimmer fra Windows prøver å oppdatere kontrollen. På min tre år gamle PC tar det litt over et sekund å legge til 100.000 tall i kombinasjonsboksen.

Dette er en praktisk kontroll for å vise tabelldata uten kompleksiteten til et rutenett. Du kan vise elementer som store eller små ikoner, som en liste over ikoner i en vertikal liste eller mest nyttig som en liste over elementer og underemner i et rutenett, og det er hva vi vil gjøre her.

Etter å ha droppet en ListView på et skjema, klikker du på kolonneneegenskapen og legger til 4 kolonner. Disse vil være TownName, X, Y og Pop. Angi teksten for hver ColumnHeader. Hvis du ikke kan se overskriftene på ListView (etter at du har lagt til alle 4), angir du ViewViews View Property til detaljer. Hvis du ser koden for dette eksemplet, kan du bla ned til der det står Windows Form Designer-kode og utvide regionen du ser koden som oppretter ListView. Det er nyttig å se hvordan systemet fungerer, og du kan kopiere denne koden og bruke den selv.

Du kan angi bredden for hver kolonne manuelt ved å flytte markøren over overskriften og dra den. Eller du kan gjøre det i koden som er synlig etter at du har utvidet skjemadesignerregionen. Du skal se kode slik:

For populasjonskolonnen gjenspeiles endringer i koden i designeren og omvendt. Vær oppmerksom på at selv om du angir at den låste egenskapen skal være sann, påvirker dette bare designeren, og ved kjøretid kan du endre størrelse på kolonner.

ListViews har også en rekke dynamiske egenskaper. Klikk på (Dynamiske egenskaper) og merk av for egenskapen du ønsker. Når du setter en egenskap til å være dynamisk, oppretter den en XML .config-fil og legger den til i Solution Explorer.

Å gjøre endringer på designtidspunktet er en ting, men vi må virkelig gjøre det når programmet kjører. En ListView består av 0 eller flere elementer. Hvert element (en ListViewItem) har en tekstegenskap og en SubItems-samling. Den første kolonnen viser vareteksten, den neste kolonnen viser SubItem [0] .text, deretter SubItem [1] .text og så videre.

Jeg har lagt til en knapp for å legge til en rad og en redigeringsboks for bynavnet. Skriv inn hvilket som helst navn i boksen og klikk på Legg til rad. Dette legger til en ny rad i ListView med bynavnet satt i den første kolonnen og de neste tre kolonnene (Underobjekter [0..2]) er befolket med tilfeldige tall (konvertert til strenger) ved å legge disse strengene til dem.

Sett nå ListView Multiselect-egenskapen til falsk. Vi vil bare velge ett element av gangen, men hvis du vil fjerne mer på en gang, er det likt, bortsett fra at du må gå gjennom i revers. (Hvis du sløyfer i normal rekkefølge og sletter elementer, er de påfølgende elementene ikke synkronisert med de valgte indeksene).

Høyreklikk-menyen fungerer ikke ennå, da vi ikke har noen menyelementer å vise på den. Så høyreklikk PopupMenu (under skjemaet), så ser du hurtigmenyen vises øverst på skjemaet der den vanlige menyredigereren vises. Klikk på den, og hvor det står Type her, skriv Fjern element. Egenskapsvinduet vil vise et MenuItem så gi nytt navn til til mniRemove. Dobbeltklikk på dette menypunktet, og du bør få menuItem1_Click koderfunksjon for hendelsesbehandler. Legg til denne koden slik at den ser slik ut.

Hvis du mister Fjern elementet, kan du bare klikke på PopupMenu-kontrollen på egen hånd under skjemaet i formen Designer. Det vil bringe det tilbake i sikte.

Men hvis du kjører det og ikke legger til et element og velger det, når du høyreklikker og får menyen og klikker på Fjern element, vil det gi et unntak fordi det ikke er noe valgt element. Det er dårlig programmering, så her løser du det. Dobbeltklikk på popup-hendelsen, og legg til denne kodelinjen.

En DataGridView er både den mest komplekse og den mest nyttige komponenten som leveres gratis med C #. Det fungerer med begge datakilder (dvs. data fra en database) og uten (dvs. data som du legger til programmatisk). For resten av denne opplæringen vil jeg vise å bruke den uten datakilder. For enklere skjermbehov kan du finne en vanlig ListView som er mer passende.

Hvis du har brukt en eldre DataGrid-kontroll, er dette bare en av dem på steroider: den gir deg mer innebygde kolonnetyper, kan jobbe med interne så vel som eksterne data, mer tilpasning av skjerm (og hendelser) og gir mer kontroll over cellehåndtering med fryserader og kolonner.

Når du designer skjemaer med rutenettdata, er det mest vanlig å spesifisere forskjellige kolonnetyper. Du kan ha avmerkingsbokser i en kolonne, lesetekst eller redigerbar tekst i en annen, og med kursnummer. Disse kolonnetypene er også vanligvis justert forskjellig med tall som generelt er riktig justert slik at desimalpoengene stiller seg opp. På kolonnivå kan du velge mellom Knapp, avkrysningsrute, ComboBox, Image, TextBox og Links. hvis de ikke er nok, kan du designe dine egne tilpassede typer.

Den enkleste måten å legge til kolonner er ved å designe i IDE. Som vi har sett før dette bare skriver kode for deg, og når du har gjort det noen ganger kan du foretrekke å legge til koden selv. Når du har gjort dette noen ganger, gir det deg innsikt i hvordan du gjør det programmatisk.

La oss starte med å legge til noen kolonner, slipp en DataGridView på skjemaet og klikk på den lille pilen i øverste høyre hjørne. Klikk deretter på Legg til kolonne. Gjør dette tre ganger. Det dukker opp en Legg til kolonnedialog der du angir navnet på kolonnen, teksten skal vises øverst på kolonnen og lar deg velge dens type. Den første kolonnen er YourName, og det er standard TextBox (dataGridViewTextBoxColumn). Sett Header Text til ditt navn også. Lag den andre kolonnen Alder og bruk en ComboBox. Den tredje kolonnen er tillatt og er en sjekkboks-kolonne.

Etter å ha lagt til alle tre, skal du se en rad med tre kolonner med en kombinasjon i midten (Alder) og en avkrysningsrute i Tillatt-kolonnen. Hvis du klikker på DataGridView, bør du finne kolonnene i egenskapsinspektøren og klikke på (samling). Dette dukker opp en dialog der du kan angi egenskaper for hver kolonne, for eksempel individuelle cellefarger, verktøytips tekst, bredde, minimum bredde osv. Hvis du kompilerer og kjører, vil du legge merke til at du kan endre kolonnebredder og kjøretid. I eiendomsinspektøren for hoved DataGridView kan du stille inn Tillat bruker til å endre størrelse på kolonner til usann for å forhindre det.

Vi skal legge til rader i DataGridView-kontrollen i kode og ex3.cs i eksemplene filen har denne koden. Begynn med å legge til en TextEdit-boks, en ComboBox og en knapp til skjemaet med DataGridView på. Sett egenskapen DataGridView AllowUserto AddRows til falsk. Jeg bruker også etiketter og kalte combobox cbAges, knappen btnAddRow og TextBox tbName. Jeg har også lagt til en Lukk-knapp for skjemaet og dobbeltklikket på den for å generere et btnClose_Click hendelseshåndteringsskjelett. Å legge til ordet Lukk () der får det til å fungere.

Som standard er egenskapen Legg til rad-aktivert egnet satt ved start. Vi vil ikke legge til noen rader i DataGridView med mindre det er tekst i både Name TextEdit-boksen og ComboBox. Jeg opprettet metoden CheckAddButton og genererte deretter en Leave event handler for redigeringsboksen Name Text ved å dobbeltklikke ved siden av ordet Leave i Properties når den viste hendelsene. Egenskaper-boksen viser dette på bildet over. Som standard viser Egenskaper-boksen egenskaper, men du kan se hendelseshåndterere ved å klikke på lynknappen.

Du kan ha brukt TextChanged-hendelsen i stedet, selv om dette vil kalle CheckAddButton () metoden for hvert tastetrykk i stedet for når kontrollen er forlatt, dvs. når en annen kontroll oppnås fokus. I aldre-kombinasjonen brukte jeg TextChanged-hendelsen, men valgte tbName_Leave-hendelseshåndtereren i stedet for å dobbeltklikke for å opprette en ny hendelsesbehandler.

Ikke alle hendelser er kompatible fordi noen hendelser gir ekstra parametere, men hvis du kan se en tidligere generert håndterer, ja, kan du bruke den. Det er stort sett et spørsmål om preferanser, du kan ha en egen hendelsesbehandler for hver kontroll du er bruker eller deler hendelseshåndterere (som jeg gjorde) når de har en felles hendelsessignatur, dvs. parameterne er samme.

Jeg ga nytt navn til DataGridView-komponenten til dGView for korthet og dobbeltklikket på AddRow for å generere et hendelseshåndteringsskjelett. Denne koden nedenfor legger til en ny tom rad, oppnår raderindeksen (det er RowCount-1 som den nettopp er lagt til og RowCount er 0 basert) og får deretter tilgang til den raden via indeksen og angir verdiene i cellene på den raden for kolonnene YourName og Alder.

Når du designer et skjema, bør du tenke på containere og kontroller og hvilke grupper av kontroller som skal holdes sammen. I vestlige kulturer leser folk fra øverst til venstre, så gjør det lettere å lese på den måten.

En beholder er en av kontrollene som kan inneholde andre kontroller. De som finnes i verktøykassen inkluderer panelet, FlowLayoutpanel, SplitContainer, TabControl og TableLayoutPanel. Hvis du ikke kan se verktøykassen, bruker du Vis-menyen, så finner du den. Beholdere holder kontrollene sammen, og hvis du flytter eller endrer størrelse på beholderen vil det påvirke plasseringen av kontrollene. Bare flytt kontrollene over containeren i Form Designer, og den vil gjenkjenne at containeren nå er ansvarlig.

Et panel ligner en GroupBox, men en GroupBox kan ikke rulle, men kan vise en bildetekst og har en kantlinje som standard. Paneler kan ha grenser, men gjør det som standard ikke. Jeg bruker GroupBoxes fordi de ser bedre ut, og dette er viktig fordi:

Paneler er nyttige for gruppering av containere også, så du kan ha to eller flere GroupBoxer på et panel.

Her er et tips for arbeid med containere. Slipp en delt beholder på et skjema. Klikk på det venstre panelet og deretter på det høyre. Nå prøver du å fjerne SplitContainer fra skjemaet. Det er vanskelig før du høyreklikker på et av panelene og deretter klikker på Velg SplitContainer1. Når alt er valgt kan du slette det. En annen måte som gjelder alle kontroller og containere er traff Esc-tasten for å velge overordnet.

Beholdere kan hekke inni hverandre også. Bare dra en liten på toppen av en større, så ser du en tynn, vertikal linje kort for å vise at den ene er inne i den andre. Når du drar foreldrebeholderen blir barnet flyttet med den. Eksempel 5 viser dette. Som standard er det lysebrune panelet ikke inne i beholderen, så når du klikker på flytteknappen blir GroupBox flyttet, men panelet er ikke det. Dra nå panelet over GroupBox slik at det er helt inne i Groupbox. Når du kompilerer og kjører denne gangen, klikker du på Flytt-knappen for å flytte begge deler.

En TableLayoutpanel er en interessant beholder. Det er en tabellstruktur organisert som et 2D-rutenett med celler der hver celle bare inneholder en kontroll. Du kan ikke ha mer enn en kontroll i en celle. Du kan spesifisere hvordan tabellen vokser når flere kontroller legges til, eller til og med hvis den ikke vokser. Det virker som modellert på en HTML-tabell fordi celler kan spenne over kolonner eller rader. Selv forankringsadferden til barnekontroller i beholderen avhenger av innstillingene for margin og polstring. Vi vil se mer om ankere på neste side.

I eksempel Ex6.cs har jeg startet med en grunnleggende to kolonnetabell og spesifisert via dialogboksen Kontroll og radstiler (velg kontrollen og klikk på den lille høyre pekende trekant plassert nær toppen til høyre for å se en liste over oppgaver og klikk på den siste) at venstre kolonne er 40% og høyre kolonne 60% av bredde. Den lar deg spesifisere kolonnebredder i absolutte pikseltermer, i prosent, eller du kan bare la den AutoSize. En raskere måte å komme til denne dialogboksen er å bare klikke på Samlingen ved siden av kolonner i Egenskapsvinduet.

Jeg har lagt til en AddRow-knapp og forlatt GrowStyle-egenskapen med sin standard AddRows-verdi. Når bordet blir fullt legger det til en ny rad. Alternativt kan du stille verdiene til AddColumns og FixedSize slik at den ikke kan vokse lenger. Når du klikker på Legg til kontroller i Ex6, kaller den AddLabel () -metoden tre ganger og AddCheckBox () en gang. Hver metode oppretter en forekomst av kontrollen og kaller deretter tblPanel. Kontroller. Legg til () Etter at den andre kontrollen er lagt til, får de tredje kontrollene tabellen til å vokse. Bildet viser det etter at knappen Add Control er blitt klikket en gang.

I tilfelle du lurer på hvor standardverdiene kommer fra metodene AddCheckbox () og AddLabel () som jeg kaller, var kontrollen opprinnelig lagt manuelt til bordet i designeren og deretter koden for å opprette den og initialisere den ble kopiert innenfra region. Du finner initialiseringskoden i InitializeComponent-metoden når du klikker på + til venstre for regionen nedenfor:

Du kan velge flere kontroller samtidig ved å holde nede shift-tasten når du velger den andre og påfølgende kontroller, til og med kontroller av forskjellige typer. Egenskaper-vinduet viser bare de egenskapene som er felles for begge, slik at du kan stille dem til samme størrelse, farge og tekstfelt osv. Selv de samme hendelsesbehandlerne kan tilordnes flere kontroller.

Avhengig av bruken, vil noen skjemaer ofte ende opp med å endre størrelse på brukeren. Ingenting ser verre ut enn å endre størrelsen på skjemaet og se kontrollene forbli i samme posisjon. Alle kontroller har forankringer som lar deg "feste" dem i de 4 kantene, slik at kontrollen beveger seg eller strekker seg når en festet kant blir flyttet. Dette fører til følgende oppførsel når en form strekkes fra høyre kant:

For knapper som Lukk som tradisjonelt er nede til høyre, er oppførsel 3 det som trengs. ListViews og DataGridViews er best med 2 hvis antall kolonner er nok til å overfylle skjemaet og trenger rulling). Topp og venstre forankring er standard. Eiendomsvinduet inneholder en fin liten redaktør som ser ut som England Flag. Bare klikk på en av stolpene (to horisontale og to vertikale) for å stille inn eller tømme riktig anker, som vist på bildet over.

En egenskap som ikke får mye omtale er Tag-egenskapen, og likevel kan den være utrolig nyttig. I Egenskapsvinduet kan du bare tilordne tekst, men i koden kan du ha hvilken som helst verdi som stammer fra Objekt.

Jeg har brukt Tag for å holde et helt objekt mens jeg bare viser noen få av dens egenskaper i en ListView. For eksempel vil du kanskje bare vise et kundenavn og nummer i en liste over kundesammendrag. Men høyreklikk på den valgte kunden og åpne deretter et skjema med alle kundens detaljer. Dette er enkelt hvis du bygger opp kundelisten ved å lese alle kundens detaljer i minnet og tilordne en referanse til kundeklasseobjektet i taggen. Alle kontroller har en tagg.

En TabControl er en hendig måte å spare plass ved å ha flere faner. Hver fane kan ha et ikon eller tekst, og du kan velge hvilken som helst fane og vise kontrollene. TabControl er en beholder, men den inneholder bare TabPages. Hver TabPage er også en beholder som kan ha normale kontroller lagt til den.

I eksempel x7.cs har jeg opprettet et sidepanel med to kategorier med den første fanen som heter Kontroller med tre knapper og en avkrysningsrute. Den andre fanesiden er merket Logger og brukes til å vise alle loggførte handlinger som inkluderer å klikke på en knapp eller slå av i avmerkingsruten. En metode som heter Log () kalles for å logge hvert knappeklikk osv. Den legger den medfølgende strengen til en ListBox.

Jeg har også lagt til to popup-menyelementer med høyreklikk på TabControl på vanlig måte. Legg først en ContextMenuStrip til skjemaet, og sett den i ContextStripMenu-egenskapen til TabControl. De to menyvalgene er Legg til ny side og Fjern denne siden. Imidlertid har jeg begrenset fjerning av sider, slik at bare nylig lagt til fanesider kan fjernes og ikke de originale to.

Dette er enkelt, bare lag en ny faneside, gi den en teksttekst for fanen og legg den til TabPages-samlingen på Tabs TabControl

Å fjerne en side er bare et spørsmål om å ringe TabPages. FjernAt () ved å bruke fanene. SelectedIndex for å få den valgte fanen.

I denne opplæringen har vi sett hvordan noen av de mer sofistikerte kontrollene fungerer og hvordan du bruker dem. I neste opplæring skal jeg fortsette med GUI-temaet og se på bakgrunnsarbeidertråden og vise hvordan du bruker det.

instagram story viewer