Dela via


Översikt över databindning med Windows Forms

I Windows Forms kan du binda till inte bara traditionella datakällor, utan även till nästan alla strukturer som innehåller data. Du kan binda till en matris med värden som du beräknar vid körning, läser från en fil eller härleder från värdena för andra kontroller.

Dessutom kan du binda valfri egenskap för valfri kontroll till datakällan. I traditionell databindning binder du vanligtvis visningsegenskapen – till exempel egenskapen Text för en TextBox kontroll – till datakällan. Med .NET har du också möjlighet att ange andra egenskaper via bindning. Du kan använda bindning för att utföra följande uppgifter:

  • Ange grafiken för en bildkontroll.

  • Ange bakgrundsfärgen för en eller flera kontroller.

  • Ange storleken på kontrollerna.

Databindning är i princip ett automatiskt sätt att ställa in alla körtidstillgängliga egenskaper för alla kontroller i ett formulär.

ADO.NET kan du skapa många olika datastrukturer som passar programmets bindningsbehov och de data du arbetar med. Du kanske vill skapa egna klasser som tillhandahåller eller använder data i Windows Forms. Dessa objekt kan erbjuda olika nivåer av funktionalitet och komplexitet. Från grundläggande databindning till att tillhandahålla stöd under designtid, felkontroll, ändringsnotifiering eller till och med stöd för en strukturerad återställning av de ändringar som gjorts i själva datan.

Konsumenter av databindningsgränssnitt

I följande avsnitt beskrivs två grupper med gränssnittsobjekt. Den första gruppen av gränssnitt implementeras på datakällor av datakällans författare. Datakällans konsumenter, till exempel Windows Forms-kontrollerna eller komponenterna, implementerar dessa gränssnitt. Den andra gruppen av gränssnitt är utformad för att användas av komponentförfattare. Komponentförfattare använder dessa gränssnitt när de skapar en komponent som stöder databindning som ska användas av Databindningsmotorn i Windows Forms. Du kan implementera dessa gränssnitt i klasser som är associerade med formuläret för att aktivera databindning. Varje fall presenterar en klass som implementerar ett gränssnitt som möjliggör interaktion med data. Datadesignverktygen för snabb programutveckling (RAD) i Visual Studio drar redan nytta av den här funktionen.

Gränssnitt för implementering av datakällaförfattare

Windows Forms-kontrollerna implementerar följande gränssnitt:

  • IList gränssnitt

    En klass som implementerar IList-gränssnittet kan vara en Array, ArrayListeller CollectionBase. Dessa är indexerade listor med objekt av typen Object och listorna måste innehålla homogena typer, eftersom det första objektet i indexet avgör typen. IList är endast tillgängligt för bindning under körning.

    Anmärkning

    Om du vill skapa en lista över affärsobjekt för bindning med Windows Forms bör du överväga att använda BindingList<T>. BindingList är en utökningsbar klass som implementerar de primära gränssnitt som krävs för dubbelriktad Windows Forms-databindning.

  • IBindingList gränssnitt

    En klass som implementerar IBindingList-gränssnittet ger en mycket högre nivå av databindningsfunktioner. Den här implementeringen erbjuder grundläggande sorteringsfunktioner och ändringsmeddelanden. Båda är användbara när listobjekten ändras och när själva listan ändras. Ändringsmeddelande är viktigt om du planerar att ha flera kontroller bundna till samma data. Det hjälper dig att göra dataändringar i en av kontrollerna för att sprida till de andra bundna kontrollerna.

    Anmärkning

    Ändringsmeddelande aktiveras för IBindingList-gränssnittet via egenskapen SupportsChangeNotification som när truegenererar en ListChanged händelse som anger att listan har ändrats eller att ett objekt i listan har ändrats.

    Typen av ändring beskrivs av egenskapen ListChangedType för parametern ListChangedEventArgs. När datamodellen uppdateras uppdateras därför även alla beroende vyer, till exempel andra kontroller som är bundna till samma datakälla. Objekt som finns i listan måste dock meddela listan när de ändras så att listan kan generera händelsen ListChanged.

    Anmärkning

    BindingList<T> tillhandahåller en allmän implementering av IBindingList-gränssnittet.

  • IBindingListView gränssnitt

    En klass som implementerar IBindingListView gränssnittet innehåller alla funktioner i en implementering av IBindingList, tillsammans med filtrering och avancerade sorteringsfunktioner. Den här implementeringen erbjuder strängbaserad filtrering och sortering i flera kolumner med egenskapsbeskrivningsriktningspar.

  • IEditableObject gränssnitt

    En klass som implementerar IEditableObject-gränssnittet gör att ett objekt kan styra när ändringar i objektet görs permanent. Den här implementeringen stöder BeginEditmetoderna , EndEditoch CancelEdit som gör att du kan återställa ändringar som gjorts i objektet. Följande är en kort förklaring av hur BeginEdit, EndEdit och CancelEdit metoderna arbetar tillsammans för att möjliggöra en återställning av gjorda ändringar i data.

    • Metoden BeginEdit signalerar början av en redigering på ett objekt. Ett objekt som implementerar det här gränssnittet måste lagra alla uppdateringar efter BeginEdit-metodanropet på ett sådant sätt att uppdateringarna kan ignoreras om metoden CancelEdit anropas. I databindning av Windows Forms kan du anropa BeginEdit flera gånger inom omfånget för en enskild redigeringstransaktion (till exempel BeginEdit, BeginEdit, EndEdit). Implementeringar av IEditableObject bör hålla reda på om BeginEdit redan har anropats och ignorera efterföljande anrop till BeginEdit. Eftersom den här metoden kan anropas flera gånger är det viktigt att efterföljande anrop till den inte är förstörande. Efterföljande BeginEdit anrop kan inte förstöra uppdateringar som har gjorts eller ändra de data som sparades vid det första BeginEdit anropet.

    • Metoden EndEdit skickar alla ändringar sedan BeginEdit anropades till det underliggande objektet, om objektet för närvarande är i redigeringsläge.

    • Metoden CancelEdit tar bort alla ändringar som gjorts i objektet.

    Mer information om hur metoderna BeginEdit, EndEditoch CancelEdit fungerar finns i Spara data tillbaka till databasen.

    Den här transaktionsbegreppet för datafunktionalitet används av DataGridView kontrollsystemet.

  • ICancelAddNew gränssnitt

    En klass som implementerar ICancelAddNew-gränssnittet implementerar vanligtvis IBindingList-gränssnittet och gör att du kan återställa ett tillägg som gjorts till datakällan med metoden AddNew. Om datakällan implementerar IBindingList-gränssnittet bör du också låta den implementera ICancelAddNew-gränssnittet.

  • IDataErrorInfo gränssnitt

    En klass som implementerar IDataErrorInfo-gränssnittet gör att objekt kan erbjuda anpassad felinformation till bundna kontroller:

    • Egenskapen Error returnerar allmän felmeddelandetext (till exempel "Ett fel har inträffat").

    • Egenskapen Item[] returnerar en sträng med det specifika felmeddelandet från kolumnen (till exempel "Värdet i kolumnen State är ogiltigt").

  • IEnumerable gränssnitt

    En klass som implementerar IEnumerable-gränssnittet används vanligtvis av ASP.NET. Stöd för Windows Forms för det här gränssnittet är endast tillgängligt via komponenten BindingSource.

    Anmärkning

    Komponenten BindingSource kopierar alla IEnumerable objekt till en separat lista i bindningssyfte.

  • ITypedList gränssnitt

    En samlingsklass som implementerar ITypedList gränssnittet tillhandahåller funktionen för att styra ordningen och uppsättningen egenskaper som exponeras för den bundna kontrollen.

    Anmärkning

    När du implementerar metoden GetItemProperties och matrisen PropertyDescriptor inte är null, kommer den sista posten i matrisen att vara egenskapsbeskrivaren som beskriver listegenskapen som är en annan lista med föremål.

  • ICustomTypeDescriptor gränssnitt

    En klass som implementerar ICustomTypeDescriptor-gränssnittet ger dynamisk information om sig själv. Det här gränssnittet liknar ITypedList men används för objekt i stället för listor. Det här gränssnittet används av DataRowView för att projicera schemat för de underliggande raderna. En enkel implementering av ICustomTypeDescriptor tillhandahålls av klassen CustomTypeDescriptor.

    Anmärkning

    För att stödja designtidsbindning till typer som implementerar ICustomTypeDescriptormåste typen även implementera IComponent och finnas som en instans i formuläret.

  • IListSource gränssnitt

    En klass som implementerar IListSource-gränssnittet möjliggör listbaserad bindning för icke-listobjekt. Metoden GetList i IListSource används för att returnera en bindbar lista från ett objekt som inte ärver från IList. IListSource används av klassen DataSet.

  • IRaiseItemChangedEvents gränssnitt

    En klass som implementerar IRaiseItemChangedEvents-gränssnittet är en bindbar lista som även implementerar IBindingList-gränssnittet. Det här gränssnittet används för att ange om din typ genererar ListChanged händelser av typen ItemChanged via dess egenskap RaisesItemChangedEvents.

    Anmärkning

    Du bör implementera IRaiseItemChangedEvents om datakällan tillhandahåller egenskapen för att lista händelsekonvertering som beskrevs tidigare och interagerar med komponenten BindingSource. Annars kommer BindingSource även att utföra konvertering av egenskaper till händelselistor, vilket resulterar i långsammare prestanda.

  • ISupportInitialize gränssnitt

    En komponent som implementerar ISupportInitialize-gränssnittet drar nytta av batchoptimeringar för att ange egenskaper och initiera samberoende egenskaper. ISupportInitialize innehåller två metoder:

    • BeginInit signalerar att objektinitiering startar.

    • EndInit signalerar att objektinitiering slutförs.

  • ISupportInitializeNotification gränssnitt

    En komponent som implementerar ISupportInitializeNotification-gränssnittet implementerar också ISupportInitialize-gränssnittet. Med det här gränssnittet kan du meddela andra ISupportInitialize komponenter om att initieringen är klar. Gränssnittet ISupportInitializeNotification innehåller två medlemmar:

  • INotifyPropertyChanged gränssnitt

    En klass som implementerar det här gränssnittet är en typ som genererar en händelse när något av dess egenskapsvärden ändras. Det här gränssnittet är utformat för att ersätta mönstret för att ha en ändringshändelse för varje egenskap för en kontroll. När det används i en BindingList<T>ska ett affärsobjekt implementera INotifyPropertyChanged-gränssnittet och BindingList'1 konverterar PropertyChanged händelser till ListChanged händelser av typen ItemChanged.

    Anmärkning

    För att ändringsmeddelanden ska ske i en bindning mellan en bunden klient och en datakälla bör din bundna datakälla antingen implementera INotifyPropertyChanged gränssnittet (rekommenderas) eller så kan du ange propertyName-händelserChanged för den bundna typen, men du bör inte göra båda.

Gränssnitt för implementering av komponentförfattare

Följande gränssnitt är utformade för förbrukning av Windows Forms databindningsmotor:

Datakällor som stöds av Windows Forms

Traditionellt har databindning använts i program för att dra nytta av data som lagras i databaser. Med Databindning i Windows Forms kan du komma åt data från databaser och data i andra strukturer, till exempel matriser och samlingar, så länge vissa minimikrav har uppfyllts.

Strukturer att binda till

I Windows Forms kan du binda till en mängd olika strukturer, från enkla objekt (enkel bindning) till komplexa listor som ADO.NET datatabeller (komplex bindning). För enkel bindning stöder Windows Forms bindning till de offentliga egenskaperna för det enkla objektet. Listbaserad bindning i Windows Forms kräver vanligtvis att objektet stöder IList gränssnittet eller IListSource gränssnittet. Om du binds med via en BindingSource komponent kan du dessutom binda till ett objekt som stöder IEnumerable gränssnittet.

I följande lista visas de strukturer som du kan binda till i Windows Forms.

  • BindingSource

    En BindingSource är den vanligaste Windows Forms-datakällan och fungerar som proxy mellan en datakälla och Windows Forms-kontroller. Det allmänna BindingSource användningsmönstret är att binda dina kontroller till BindingSource och binda BindingSource till datakällan (till exempel en ADO.NET datatabell eller ett affärsobjekt). BindingSource tillhandahåller tjänster som möjliggör och förbättrar nivån på stöd för databindning. Till exempel, Windows Forms-listbaserade kontroller som DataGridView och ComboBox stöder inte direkt bindning till IEnumerable-datakällor. Du kan dock aktivera det här scenariot genom att binda via en BindingSource. I det här fallet konverterar BindingSource datakällan till en IList.

  • Enkla objekt

    Windows Forms stöder databindning av kontrollegenskaper till offentliga egenskaper på instansen av ett objekt med hjälp av Binding-typen. Windows Forms stöder även bindningslistbaserade kontroller, till exempel en ListControl till en objektinstans när en BindingSource används.

  • Matris eller samling

    För att fungera som en datakälla måste en lista implementera IList-gränssnittet. ett exempel är en matris som är en instans av klassen Array. Mer information om matriser finns i How to: Create an Array of Objects (Visual Basic).

    I allmänhet bör du använda BindingList<T> när du skapar listor med objekt för databindning. BindingList är en allmän version av IBindingList-gränssnittet. Gränssnittet IBindingList utökar IList-gränssnittet genom att lägga till egenskaper, metoder och händelser som krävs för dubbelriktad databindning.

  • IEnumerable

    Windows Forms-kontroller kan bindas till datakällor som endast stöder IEnumerable gränssnittet om de är bundna via en BindingSource komponent.

  • ADO.NET dataobjekt

    ADO.NET innehåller många datastrukturer som lämpar sig för bindning till. Var och en varierar i sin sofistikering och komplexitet.

    • DataColumn

      A DataColumn är det viktigaste byggblocket i en DataTable, eftersom flera kolumner utgör en tabell. Varje DataColumn har en DataType egenskap som avgör vilken typ av data kolumnen innehåller (till exempel biltypen i en tabell som beskriver bilar). Du kan enkelt binda en kontroll (till exempel en TextBox kontrolls Text egenskap) till en kolumn i en datatabell.

    • DataTable

      En DataTable är representationen av en tabell, med rader och kolumner, i ADO.NET. En datatabell innehåller två samlingar: DataColumn, som representerar datakolumnerna i en viss tabell (som slutligen avgör vilka typer av data som kan anges i tabellen) och DataRow, som representerar datarader i en viss tabell. Du kan komplexbinda en kontroll till informationen i en datatabell (till exempel binda DataGridView-kontrollen till en datatabell). Men när du binder till en DataTableär du en bindning till tabellens standardvy.

    • DataView

      En DataView är en anpassad vy av en enda datatabell som kan filtreras eller sorteras. En datavy är den data "ögonblicksbild" som används av kontroller bundna till komplexitet. Du kan enkelt binda eller komplext binda till data i en datavy, men observera att du binder till en oföränderlig "ögonblicksbild" av data i stället för en direkt uppdaterande datakälla.

    • DataSet

      En DataSet är en samling tabeller, relationer och begränsningar för data i en databas. Du kan enkelbinda eller komplexbinda till data inom en dataset, men observera att du binder till standardvärdet DataViewManager för DataSet (se nästa punkt).

    • DataViewManager

      En DataViewManager är en anpassad vy över hela DataSet, som liknar en DataView, men med de relationer som ingår. Med en DataViewSettings samling kan du ange standardfilter och sorteringsalternativ för alla vyer som DataViewManager har för en viss tabell.

Typer av databindning

Windows Forms kan dra nytta av två typer av databindning: enkel bindning och komplex bindning. Var och en har olika fördelar.

Typ av databindning Beskrivning
Enkel databindning Möjligheten för en kontroll att binda till ett enda dataelement, till exempel ett värde i en kolumn i en datamängdstabell. Enkel databindning är den typ av bindning som är typisk för kontroller, till exempel en TextBox kontroll eller Label kontroll, som är kontroller som vanligtvis bara visar ett enda värde. I själva verket kan alla egenskaper i en kontroll bindas till ett fält i en databas. Det finns omfattande stöd för den här funktionen i Visual Studio.

Mer information finns i Navigera data och Skapa en enkel-bunden kontroll (Windows Forms .NET).
Komplex databindning Möjligheten för en kontroll att binda till mer än ett dataelement, vanligtvis mer än en uppgift i en databas. Komplex bindning kallas även listbaserad bindning. Exempel på kontroller som stöder komplex bindning är kontrollerna DataGridView, ListBoxoch ComboBox. Ett exempel på komplex databindning finns i How to: Bind a Windows Forms ComboBox or ListBox Control to Data.

Bindning av källkomponent

För att förenkla databindningen kan du med Windows Forms binda en datakälla till komponenten BindingSource och sedan binda kontroller till BindingSource. Du kan använda BindingSource i enkla eller komplexa bindningsscenarier. I båda fallen fungerar BindingSource som mellanhand mellan datakällan och bundna kontroller som tillhandahåller valutahantering av ändringsmeddelanden och andra tjänster.

Vanliga scenarier som använder databindning

Nästan alla kommersiella program använder information som lästs från datakällor av en eller annan typ, vanligtvis via databindning. I följande lista visas några av de vanligaste scenarierna som använder databindning som metod för datapresentation och manipulering.

Scenarium Beskrivning
Rapportering Rapporter är ett flexibelt sätt för dig att visa och sammanfatta dina data i ett utskrivet dokument. Det är vanligt att skapa en rapport som skriver ut det valda innehållet i en datakälla antingen på skärmen eller till en skrivare. Vanliga rapporter omfattar listor, fakturor och sammanfattningar. Objekt formateras i kolumner med listor, med underobjekt organiserade under varje listelement, men du bör välja den layout som bäst passar data.
Datainmatning Ett vanligt sätt att ange stora mängder relaterade data eller att be användarna om information är via ett formulär för datainmatning. Användare kan ange information eller välja alternativ med hjälp av textrutor, alternativknappar, listrutor och kryssrutor. Informationen skickas sedan och lagras i en databas, vars struktur baseras på den angivna informationen.
Huvud- och detaljrelation Ett huvud-/detaljprogram är ett format för att titta på relaterade data. Mer specifikt finns det två datatabeller med en relation som ansluter i det klassiska affärsexemplet, en "Kunder"-tabell och en "Beställningar"-tabell med en relation mellan dem som länkar kunder och deras respektive beställningar. Mer information om hur du skapar ett huvud-/detaljprogram med två Windows Forms-kontroller DataGridView finns i How to: Create a Master/Detail Form Using Two Windows Forms DataGridView Controls (Så här skapar du ett huvud-/informationsformulär med två Windows Forms DataGridView-kontroller).
Uppslagstabell Ett annat vanligt scenario för datapresentation/manipulering är tabellsökningen. Som en del av en större datavisning används ofta en ComboBox kontroll för att visa och manipulera data. Nyckeln är att de data som visas i den ComboBox kontrollen skiljer sig från de data som skrivits till databasen. Om du till exempel har en ComboBox kontroll som visar de artiklar som är tillgängliga från en livsmedelsbutik, skulle du förmodligen vilja se namnen på produkterna (bröd, mjölk, ägg). Men för att underlätta informationshämtningen i databasen och för databasnormalisering skulle du förmodligen lagra informationen för de specifika objekten i en viss ordning som artikelnummer (#501, #603 och så vidare). Det finns därför en implicit koppling mellan det "vänliga namnet" för livsmedelsartikeln i kontrollen ComboBox i formuläret och det relaterade artikelnumret som finns i en beställning. Det är kärnan i en tabelluppslagning. Mer information finns i Så här: Skapa en uppslagstabell med Windows Forms BindingSource-komponenten.

Se även