C#: atestat și pregătire ONTI

C#: BindingSource și filtrarea unui DataTable

Leagă un DataTable la un tabel Windows Forms și filtrează datele încărcate. Distinge filtrul local de interogarea SQL și păstrează identitatea înregistrărilor.

Uneori ai deja un set mic de date în memorie și vrei să schimbi rapid ce rânduri sunt vizibile. DataView, expus prin DefaultView, poate filtra DataTable fără să șteargă datele din el. BindingSource transmite rezultatul către DataGridView. Filtrarea locală nu execută o nouă interogare în baza de date.

Cum lucrezi cu exemplul

Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

Construim două cărți în DataTable și legăm DefaultView la BindingSource. Un buton arată numai categoria Programare, iar altul elimină filtrul. Folosim aici expresii fixe și controlate. Sintaxa RowFilter nu este SQL și nu primește parametri OleDb; concatenarea directă a intrării libere cere reguli specifice de escapare și nu este introdusă în acest exemplu.

Tabelul este read-only. ID-ul rămâne parte a rândului chiar dacă poziția sa vizuală se schimbă. Când vei adăuga editare, obține DataRowView sau obiectul legat și citește cheia, fără să presupui că indexul vizual corespunde tabelului original.

Exemplu și rezultat așteptat

La pornire vezi Algoritmi și Povesti. Butonul Programare lasă un singur rând. Butonul Toate readuce ambele rânduri. Numărul Rows din DataTable rămâne doi în ambele stări, fiindcă filtrul schimbă doar vederea.

Schemă pentru lecția 37: DataTable: 2 rânduri; DataView: Category=Programare; Vizibile: 1; Toate → vizibile: 2.DataTable: 2 rânduri → DataView: Category=Programare → Vizibile: 1 → Toate → vizibile: 2.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new LessonForm());
    }
}

class LessonForm : Form
{
readonly BindingSource source=new BindingSource();
    public LessonForm() {
        Text="Filtrare locala";ClientSize=new Size(600,320);
        var table=new System.Data.DataTable();table.Columns.Add("BookId",typeof(int));
        table.Columns.Add("Title",typeof(string));table.Columns.Add("Category",typeof(string));
        table.Rows.Add(1,"Algoritmi","Programare");table.Rows.Add(2,"Povesti","Literatura");
        source.DataSource=table.DefaultView;
        var grid=new DataGridView {Dock=DockStyle.Fill,ReadOnly=true,AllowUserToAddRows=false,DataSource=source};
        var bar=new FlowLayoutPanel {Dock=DockStyle.Top,Height=42};
        var filter=new Button {Text="Programare",Width=130};var all=new Button {Text="Toate"};
        filter.Click += (s,e) => {source.Filter="Category = 'Programare'";};
        all.Click += (s,e) => {source.RemoveFilter();};bar.Controls.Add(filter);bar.Controls.Add(all);
        Controls.Add(grid);Controls.Add(bar);
    }
    protected override void Dispose(bool disposing) {if(disposing)source.Dispose();base.Dispose(disposing);}
}

Greșeli și limite

Nu încărca o bază imensă în memorie doar pentru a folosi RowFilter. Pentru volume mari, filtrează la sursă și paginează. Nu trimite sintaxa RowFilter unui provider SQL și nu prezenta un filtru local ca economie garantată de trafic. Datele au fost deja citite.

Exersează

Adaugă o categorie fără rezultate și verifică vederea goală fără pierderea datelor. După fiecare filtru, afișează separat numărul rândurilor totale și vizibile. Pentru setul inițial, Programare trebuie să dea total 2, vizibile 1. Verifică revenirea la toate datele.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: actualizări SQL și numărul rândurilor afectate

Lecția următoare: C#: tranzacții pentru operații care reușesc împreună.

Referință: documentația Microsoft.

Întrebări frecvente

Filtrarea șterge rânduri?

Nu. DataView schimbă rândurile vizibile, fără eliminarea lor din DataTable.

RowFilter este SQL?

Nu. Are sintaxa expresiilor DataColumn și nu este o comandă transmisă bazei de date.

Pot folosi indexul vizual ca ID?

Nu. Filtrarea schimbă pozițiile, în timp ce cheia rămâne stabilă.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →