Dela via


Databindning

LINQ till SQL stöder bindning till vanliga kontroller, till exempel rutnätskontroller. Mer specifikt definierar LINQ till SQL de grundläggande mönstren för bindning till ett datarutnät och hantering av huvudinformationsbindning, både när det gäller visning och uppdatering.

Underliggande princip

LINQ till SQL översätter LINQ-frågor till SQL för körning på en databas. Resultatet är starkt skrivet IEnumerable. Eftersom dessa objekt är vanliga CLR-objekt (Common Language Runtime) kan vanlig objektdatabindning användas för att visa resultatet. Å andra sidan kräver ändringsåtgärder (infogningar, uppdateringar och borttagningar) ytterligare steg.

Åtgärd

Implicit bindning till Windows Forms-kontroller utförs genom att implementera IListSource. Datakällor som är generiska Table<TEntity> (Table<T> i C# eller Table(Of T) Visual Basic) och generiska DataQuery har uppdaterats för att implementera IListSource. Användargränssnitt (UI) databindningsmotorer (Windows Forms och Windows Presentation Foundation) testar båda om deras datakälla implementerar IListSource. Att skriva en direkt påverkan av en fråga till en datakälla för en kontroll anropar därför implicit LINQ till SQL-samlingsgenerering, som i följande exempel:

DataGrid dataGrid1 = new DataGrid();
DataGrid dataGrid2 = new DataGrid();
DataGrid dataGrid3 = new DataGrid();

var custQuery =
    from cust in db.Customers
    select cust;
dataGrid1.DataSource = custQuery;
dataGrid2.DataSource = custQuery;
dataGrid2.DataMember = "Orders";

BindingSource bs = new BindingSource();
bs.DataSource = custQuery;
dataGrid3.DataSource = bs;
Dim dataGrid1 As New DataGrid()
Dim dataGrid2 As New DataGrid()
Dim dataGrid3 As New DataGrid()

Dim custQuery = _
    From cust In db.Customers _
    Select cust

dataGrid1.DataSource = custQuery
dataGrid2.DataSource = custQuery
dataGrid2.DataMember = "Orders"

Dim bs = _
    New BindingSource()
bs.DataSource = custQuery
dataGrid3.DataSource = bs

Samma sak gäller för Windows Presentation Foundation:

ListView listView1 = new ListView();
var custQuery2 =
    from cust in db.Customers
    select cust;

ListViewItem ItemsSource = new ListViewItem();
ItemsSource = (ListViewItem)custQuery2;
Dim listView1 As New ListView()
Dim custQuery2 = _
From cust In db.Customers _
Select cust

Dim ItemsSource As New ListViewItem
ItemsSource = custQuery2

Samlingsgenerationer implementeras av generiska Table<TEntity> och generiska DataQuery i GetList.

Implementering av IListSource

LINQ till SQL implementerar IListSource på två platser:

  • Datakällan är : Table<TEntity>LINQ till SQL bläddrar i tabellen för att fylla i en DataBindingList samling som har en referens i tabellen.

  • Datakällan är en IQueryable<T>. Det finns två scenarier:

    • Om LINQ till SQL hittar den underliggande Table<TEntity> från IQueryable<T>tillåter källan utgåva och situationen är densamma som i den första punktpunkten.

    • Om LINQ till SQL inte kan hitta den underliggande Table<TEntity>, tillåter källan inte utgåva (till exempel groupby). LINQ till SQL bläddrar i frågan för att fylla i en allmän SortableBindingList, vilket är en enkel BindingList<T> som implementerar sorteringsfunktionen för T-entiteter för en viss egenskap.

Specialiserade samlingar

För många funktioner som beskrivs tidigare i det här dokumentet BindingList<T> har specialiserat sig på vissa olika klasser. Dessa klasser är generiska SortableBindingList och generiska DataBindingList. Båda deklareras som interna.

Allmän sorterbarbindningslista

Den här klassen ärver från BindingList<T>och är en sorterbar version av BindingList<T>. Sortering är en minnesintern lösning och kontaktar aldrig själva databasen. BindingList<T> implementerar IBindingList men stöder inte sortering som standard. Implementerar IBindingList dock BindingList<T> med virtuella kärnmetoder. Du kan enkelt åsidosätta dessa metoder. Allmänna SortableBindingList åsidosättningar SupportsSortingCore, SortPropertyCore, SortDirectionCoreoch ApplySortCore. ApplySortCore anropas av ApplySort och sorterar listan med T-objekt för en viss egenskap.

Ett undantag utlöses om egenskapen inte tillhör T.

För att uppnå sortering skapar LINQ till SQL en generisk SortableBindingList.PropertyComparer klass som ärver från generiska IComparer.Compare och implementerar en standardjäxare för en viss typ T, en PropertyDescriptoroch en riktning. Den här klassen skapar dynamiskt en Comparer av T där T är PropertyType PropertyDescriptorför . Sedan hämtas standardjäxaren från den statiska generiska Comparer. En standardinstans erhålls med reflektion.

Generic SortableBindingList är också basklassen för DataBindingList. Generic SortableBindingList erbjuder två virtuella metoder för att pausa eller återuppta objekt som lägger till/tar bort spårning. Dessa två metoder kan användas för basfunktioner som sortering, men kommer verkligen att implementeras av överklasser som generiska DataBindingList.

Allmän DataBindingList

Den här klassen ärver från generiska SortableBindingLIst. Generic DataBindingList behåller en referens till den underliggande generiska Table generiska IQueryable filen som används för den första fyllningen av samlingen. Generic DatabindingList lägger till spårning för objekttillägg/borttagning i samlingen genom att InsertItemåsidosätta () och RemoveItem(). Den implementerar också funktionen för att pausa/återuppta spårning för att göra spårningen villkorsstyrd. Den här funktionen gör att generiska DataBindingList dra nytta av all polymorf användning av spårningsfunktionen i de överordnade klasserna.

Bindning till EntitySets

Bindning till EntitySet är ett specialfall eftersom EntitySet det redan är en samling som implementerar IBindingList. LINQ till SQL lägger till stöd för sortering och avbokning (ICancelAddNew). En EntitySet klass använder en intern lista för att lagra entiteter. Den här listan är en lågnivåsamling baserad på en generisk matris, den generiska ItemList klassen.

Lägga till en sorteringsfunktion

Matriser erbjuder en sorteringsmetod (Array.Sort()) som du kan använda med en Comparer av T. LINQ till SQL använder den generiska SortableBindingList.PropertyComparer klassen som beskrivs tidigare i det här avsnittet för att hämta detta Comparer för egenskapen och riktningen som ska sorteras på. En ApplySort metod läggs till i generisk ItemList för att anropa den här funktionen.

På sidan EntitySet måste du nu deklarera sorteringsstöd:

När du använder system.Windows.Forms.BindingSource och binder en EntitySet<TEntity> till System.Windows.Forms.BindingSource.DataSource måste du anropa EntitySet<TEntity>. GetNewBindingList för att uppdatera BindingSource.List.

Om du använder en System.Windows.Forms.BindingSource och anger egenskapen BindingSource.DataMember och anger BindingSource.DataSource till en klass som har en egenskap med namnet i BindingSource.DataMember som exponerar EntitySet<TEntity>, behöver du inte anropa EntitySet<TEntity>. GetNewBindingList för att uppdatera BindingSource.List men du förlorar sorteringsfunktionen.

Cachelagring

LINQ till SQL-frågor implementerar GetList. När klassen Windows Forms BindingSource uppfyller det här gränssnittet anropas GetList() tred.tid för en enda anslutning. För att undvika den här situationen implementerar LINQ till SQL en cache per instans som ska lagras och returnerar alltid samma genererade samling.

Annullering

IBindingList definierar en AddNew metod som används av kontroller för att skapa ett nytt objekt från en bunden samling. Kontrollen DataGridView visar den här funktionen mycket bra när den sista synliga raden innehåller en stjärna i rubriken. Stjärnan visar att du kan lägga till ett nytt objekt.

Förutom den här funktionen kan en samling även implementera ICancelAddNew. Med den här funktionen kan kontrollerna avbryta eller verifiera att det nya redigerade objektet har verifierats eller inte.

ICancelAddNew implementeras i alla LINQ-till SQL-databundna samlingar (generiska SortableBindingList och generiska EntitySet). I båda implementeringarna utförs koden på följande sätt:

  • Låter objekt infogas och sedan tas bort från samlingen.

  • Spårar inte ändringar så länge användargränssnittet inte checkar in utgåvan.

  • Spårar inte ändringar så länge utgåvan avbryts (CancelNew).

  • Tillåter spårning när utgåvan har checkats in (EndNew).

  • Låter samlingen bete sig normalt om det nya objektet inte kommer från AddNew.

Felsökning

I det här avsnittet beskrivs flera objekt som kan hjälpa dig att felsöka dina LINQ-till SQL-databindningsprogram.

  • Du måste använda egenskaper. det räcker inte att bara använda fält. Windows Forms kräver den här användningen.

  • Som standard imagemappas , varbinaryoch timestamp databastyper till bytematris. Eftersom ToString() det inte stöds i det här scenariot kan dessa objekt inte visas.

  • En klassmedlem som mappas till en primärnyckel har en setter, men LINQ till SQL stöder inte ändring av objektidentitet. Därför kan inte den primära/unika nyckel som används i mappningen uppdateras i databasen. En ändring i rutnätet orsakar ett undantag när du anropar SubmitChanges.

  • Om en entitet är bunden i två separata rutnät (till exempel en huvuddel och en annan detalj) sprids inte en Delete i huvudrutnätet till detaljrutnätet.

Se även