HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

DataRow osztály használata


DataRow osztály 1. rész

Példaprogram letöltése

8456 bájt

Múlt heti „DataColumn osztály használata” című cikkünkben bemutattuk, hogy egy adathalmaz oszlopainak tulajdonságait miként határozhatjuk meg, hogyan kezelhetjük. Most induló ké trészes sorozatunkban az adathalmazunk sorait leíró és kezelő DataRow osztályt mutatjuk be, sorra véve annak tulajdonságait, függvényeit, melyek segítségével létrehozhatunk új sorokat, kezelhetünk már meglévőket.

Tekintsük át elsőként, hogy milyen lehetőségeink is vannak: milyen property-k, függvények állnak a rendelkezésünkre.
Item
Osztály: System.Data.DataRow
public object this[string columnName] {get; set;}
Egy adatsor elemeit az Item property-n keresztül érhetünk el. Ez a property a DataRow osztály indexelője.
Paraméterek
string columnName
Ha az indexben sztringet adunk meg, akkor ezzel, az adott oszlop nevével hivatkozhatunk az elérni kívánt adatra.
Item
Osztály: System.Data.DataRow
public object this[DataColumn column] {get; set;}
Egy adatsor elemeit az Item property-n keresztül érhetjük el. Ez a property a DataRow osztály indexelője.
Paraméterek
DataColumn column
Ha az indexben DataColumn osztályt adunk meg, akkor az ebben leírt oszlop értékét tudjuk elérni.
Item
Osztály: System.Data.DataRow
public object this[int columnIndex] {get; set;}
Egy adatsor elemeit az Item property-n keresztül érhetjük el. Ez a property a DataRow osztály indexelője.
Paraméterek
int columnIndex
Ha az indexben int értéket adunk meg, akkor ezzel az adott oszlop sorszámával hivatkozhatunk az elérni kívánt adatra.
ItemArray
Osztály: System.Data.DataRow
public object[] ItemArray {get; set;}
Lehetőségünk van egy olyan tömb lekérésére is, mely object típusban tárolja az összes elemét az adott adatsornak. Így végigmenve ezen a tömbön, könnyedén elérhetjük az adott sor minden elemét.
RowState
Osztály: System.Data.DataRow
public DataRowState RowState {get;}
Az adott sor aktuális státuszát kérdezhetjük le a RowState property segítségével. Ennek lehetséges értékei az alábbiak:
Megnevezés Leírás
Added Az adott sor újonnan lett létrehozva és az AcceptChanges még nem került meghívásra.
Deleted Az adott sor törlésre került a DataRow Delete függvénye által.
Detached A sor már létre lett hozva, de még nem része a DataRowCollection-nak. Ez az állapot közvetlenül a létrehozás után jön létre, de még a kollekcióhoz való hozzáadás előtt. Ez az állapot akkor is, ha a sor épp eltávolításra kerül a kollekcióból.
Modified A sor tartalma megváltozott már az AcceptChanges függvény utolsó hívása óta.
Unchanged A sor tartalma nem változott az AcceptChanges függvény utolsó hívása óta.
Table
Osztály: System.Data.DataRow
public DataTable Table {get;}
Ha már hozzárendeltük a sort egy táblához, akkor ezt a táblát a DataRow osztály Table property-jén keresztül is elérhetjük.
RowError
Osztály: System.Data.DataRow
public string RowError {get; set;}
DataRow osztály hibakezelésének egyik lehetősége a RowError property használata. Itt tulajdonképpen arról van csak szó, hogy egy tetszőleges sztringet hozzárendelhetünk minden adatsorhoz. E sztring azonban célszerűen a sorban lévő hibának a leírását kellene, hogy tartalmazza. Az itt megadott szöveg például automatikusan megjelenik akkor, ha az adathalmazunk egy DataGrid kontrolhoz van kötve. Ekkor azoknál a soroknál, ahol a RowError tartalmaz hibaleírást a DataGrid legelső cellájában megjelenik egy kis ábra. Ha az egérrel az ábra fölé áll a felhasználó, akkor egy kis ablakban látható lesz az itt megadott szöveg.
HasErrors
Osztály: System.Data.DataRow
public bool HasErrors {get;}
Ha a DataRow tartalmaz általunk megadott hibát, akkor a HasErrors property igaz értéket ad vissza.
SetColumnError
Osztály: System.Data.DataRow
public void SetColumnError(
DataColumn column,
string error
);
A RowError property hibakezelésének egy másik lehetősége, a SetColumnError függvény használata. Itt a hibaüzenet szövegét nem egy adatsorhoz, hanem a soron belül egy adott oszlophoz rendelhetjük. Ha a DataRow szintén egy DataGrid-hez van kötve, akkor annak adott cellájában megjelenik egy kis figyelmeztető ábra, mely fölé állva az egérrel, látható lesz az itt megadott szöveg.
Paraméterek
DataColumn column
A column paraméter írja le, hogy az adott sorban melyik oszlophoz kívánjuk beállítani a hibaüzenet szövegét.
string error
Az error paraméterben adható meg a hiba leírása sztringként.
SetColumnError
Osztály: System.Data.DataRow
public void SetColumnError(
int columnIndex,
string error
);
A RowError property hibakezelésének egy másik lehetősége, a SetColumnError függvény használata. Itt a hibaüzenet szövegét nem egy adatsorhoz, hanem a soron belül egy adott oszlophoz rendelhetjük. Ha a DataRow szintén egy DataGrid-hez van kötve, akkor annak adott cellájában megjelenik egy kis figyelmeztető ábra, mely fölé állva az egérrel, látható lesz az itt megadott szöveg.
Paraméterek
int columnIndex
Az adott sorban az oszlopot kiválaszthatjuk annak sorszáma szerint is. Ekkor a columnIndex paraméterben megadott sorszámú oszlophoz történik meg a hibaüzenet hozzárendelése.
string error
Az error paraméterben adható meg a hiba leírása sztringként.
SetColumnError
Osztály: System.Data.DataRow
public void SetColumnError(
string columnName,
string error
);
A RowError property hibakezelésének egy másik lehetősége, a SetColumnError függvény használata. Itt a hibaüzenet szövegét nem egy adatsorhoz, hanem a soron belül egy adott oszlophoz rendelhetjük. Ha a DataRow szintén egy DataGrid-hez van kötve, akkor annak adott cellájában megjelenik egy kis figyelmeztető ábra, mely fölé állva az egérrel, látható lesz az itt megadott szöveg.
Paraméterek
string columnName
Az adott sorban az oszlopot kiválaszthatjuk annak neve szerint is. Ekkor a columnName paraméterben megadott nevű oszlophoz történik meg a hibaüzenet hozzárendelése.
string error
Az error paraméterben adható meg a hiba leírása sztringként.
GetColumnError
Osztály: System.Data.DataRow
public string GetColumnError(
DataColumn column
);
Az adott oszlophoz rendelt hibaüzenet le is kérdezhető a GetColumnError függvény felhasználásával.
Paraméterek
DataColumn column
A kérdéses oszlopot meghatározhatjuk egy DataColumn típusú osztállyal.
Visszatérési érték
Az oszlophoz rendelt hibaüzenet szövegét kapjuk vissza sztringként.
GetColumnError
Osztály: System.Data.DataRow
public string GetColumnError(
int columnIndex
);
Az adott oszlophoz rendelt hibaüzenet le is kérdezhető a GetColumnError függvény felhasználásával.
Paraméterek
int columnIndex
A kérdéses oszlop kiválasztható annak sorszáma alapján is.
Visszatérési érték
Az oszlophoz rendelt hibaüzenet szövegét kapjuk vissza sztringként.
GetColumnError
Osztály: System.Data.DataRow
public string GetColumnError(
string columnName
);
Az adott oszlophoz rendelt hibaüzenet le is kérdezhető a GetColumnError függvény felhasználásával.
Paraméterek
string columnName
A kérdéses oszlop kiválasztható annak neve alapján is.
Visszatérési érték
Az oszlophoz rendelt hibaüzenet szövegét kapjuk vissza sztringként.
GetColumnsInError
Osztály: System.Data.DataRow
public DataColumn[] GetColumnsInError(
);
A GetColumnsInError függvény felhasználásával megtudhatjuk, hogy az adott sorban mely oszlopok tartalmaznak hibákat.
Visszatérési érték
A hibákat tartalmazó oszlopokról kapunk egy tömböt, melynek minden eleme egy-egy DataColumn osztály lesz.
ClearErrors
Osztály: System.Data.DataRow
public void ClearErrors();
Az összes hiba egyidejű törléséhez a ClearErrors függvény gondoskodik.
Megjegyzés
A ClearErrors függvény egyidejűleg törli a RowError property-be beállított hibaüzenetet és a SetColumnError függvény által megadott hibaüzeneteket is.
BeginEdit
Osztály: System.Data.DataRow
public void BeginEdit();
A BeginEdit függvény hívásával a DataRow osztály szerkesztő üzemmódba kerül. Célszerű ezt a lehetőséget akkor használni, ha sok módosítást végzünk egy időben, illetve ha a változások esetleges visszavonására lehet szükségünk.
CancelEdit
Osztály: System.Data.DataRow
public void CancelEdit();
A BeginEdit függvény hívása óta történt változásokat lehet helyreállítani az adatsorban a CancelEdit hívásával.
EndEdit
Osztály: System.Data.DataRow
public void EndEdit();
A BeginEdit függvény hívása óta történt változásokat lehet véglegesíteni az adatsorban az EndEdit hívásával. Véglegesítés után már nincs lehetőség visszavonásra.
SetNull
Osztály: System.Data.DataRow
protected void SetNull(
DataColumn column
);
Az adatsor valamely oszlopában lévő adat törölhető és értéke null-ra állítható a SetNull függvény hívásával.
Paraméterek
DataColumn column
Paraméterként annak az oszlopnak a DataColumn osztály típusú példányát kell megadnunk, melynek értékét törölni szeretnénk.
IsNull
Osztály: System.Data.DataRow
public bool IsNull(
DataColumn column
);
Az adatsor valamely oszlopában lévő adat meglétét ellenőrizhetjük az IsNull függvénnyel.
Paraméterek
DataColumn column
Paraméterként annak az oszlopnak a DataColumn osztály típusú példányát kell megadnunk, melynek értékét ellenőrizni szeretnénk.
Visszatérési érték
Igaz, ha a megadott oszlopban nincs érték, vagyis az null.
IsNull
Osztály: System.Data.DataRow
public bool IsNull(
int columnIndex
);
Az adatsor valamely oszlopában lévő adat meglétét ellenőrizhetjük az IsNull függvénnyel.
Paraméterek
int columnIndex
Paraméterként az ellenőrizni kívánt oszlop sorszámát adhatjuk meg.
Visszatérési érték
Igaz, ha a megadott oszlopban nincs érték, vagyis az null.
IsNull
Osztály: System.Data.DataRow
public bool IsNull(
string columnName
);
Az adatsor valamely oszlopában lévő adat meglétét ellenőrizhetjük az IsNull függvénnyel.
Paraméterek
string columnName
Paraméterként az ellenőrizni kívánt oszlop nevét adhatjuk meg.
Visszatérési érték
Igaz, ha a megadott oszlopban nincs érték, vagyis az null.
A példaprogram
A sok elmélet után nézzük a gyakorlatot. Létrehozunk egy olyan példát, melynek a gyakorlatban semmi értelme, ám jól szemlélteti az eddig bemutatott property-k, függvények használatát.
1. gomb
Ehhez első lépésként szükségünk lesz egy DataTable-ra, melyben az adatokat létrehozhatjuk, tárolhatjuk. Ehhez szükségünk lesz néhány oszlopra is a táblában. Végül az sem hátrány, ha mindezt láthatjuk is, így egy DataGrid kontrolhoz kötjük az így létrejött DataTable-t.
  private void button1_Click(object sender, System.EventArgs e)
  {
    dt = new DataTable("Products");
    dt.Columns.Add("c1", System.Type.GetType("System.Int32"));
    dt.Columns.Add("c2", System.Type.GetType("System.String"));
    dt.Columns.Add("c3", System.Type.GetType("System.Int32"));    
    dataGrid1.DataSource = dt.DefaultView;        
  }
2. gomb
Most hogy már van egy üres táblánk három oszloppal, nézzük miként helyezhetünk el benne sorokat is. Ehhez már szükségünk lesz a DataRow osztály használatára, melyből egyszerűen létrehozunk egy példányt.
  private void button2_Click(object sender, System.EventArgs e)
  {
    Random r = new Random();
    DataColumn dc = dt.Columns["c3"];
    DataRow dr = dt.NewRow();
Felhasználva a DataRow indexelőjét, az Item property-t értéket is adunk soron belül az egyes mezőknek. Erre az Item verziói három különböző lehetőséget biztosítanak. Így hivatkozhatunk egy mezőre annak neve, sorszáma, vagy a DataColumn osztály példánya alapján is.
    dr["c1"] = dt.Rows.Count;
    dr[1] = DateTime.Now.ToLongTimeString();
    dr[dc] = r.Next(Int32.MaxValue).ToString();
Ha feltöltöttük a sort adatokkal, akkor ezt még hozzá is kell adnunk a DataTable-höz, annak Rows property-jén keresztül az Add függvény hívásával. Végül meghívjuk a DataTable AcceptChanges függvényét, hogy az újonnan létrehozott sort véglegesítsük. Ennek hasznát majd alábbi példáinkban lehet látni.
    dt.Rows.Add(dr);
    dt.AcceptChanges();
  }
3. gomb
A DataRow osztály ItemArray property-jére láthatunk itt példát. Azt nézzük meg, hogy miként lehet elérni a DataTable-be felvett első sor tartalmát ezen keresztül. Először ellenőriznünk kell, hogy van-e már első sor, vagyis a DataTable sorainak száma nagyobb-e nullánál.
Az első sor értékeit egy ListBox-ba fogjuk kigyűjteni. Ehhez egy foreach ciklust használunk. Mivel az ItemArray egy olyan tömböt ad vissza, melynek minden eleme Object típusú, így ennek ToString függvényével konvertálhatjuk az adott adatot szövegessé és így már megjeleníthetjük a ListBox-ba könnyedén. A ciklus végére az adattáblánk első sorának összes eleme a ListBox-ban lesz látható.
  private void button3_Click(object sender, System.EventArgs e)
  {
    if (dt.Rows.Count > 0)
    {
      listBox1.Items.Clear();
      DataRow dr = dt.Rows[0];
      foreach (object o in dr.ItemArray)
      {
        listBox1.Items.Add(o.ToString());                      
      }
    }
  }
4. gomb
Amint arról már volt szó a RowState property segítségével megtudhatjuk, hogy egy sor aktuálisan milyen állapotban van. Ennél a példánál a DataTable összes sorának állapotát jelenítjük meg a ListBox-ban. A 2. gombnál lévő AcceptChanges függvény hívása miatt Unchanged státuszú lesz minden sor. Ha most a DataGrid-en keresztül módosítjuk egy-két sor adatát, vagy felveszünk új sort és ismét a 4. gombra kattintunk, akkor jól látható, hogy miként változtak a sorok státuszai.
  private void button4_Click(object sender, System.EventArgs e)
  {
    ...
    for (int i=0; i<dt.Rows.Count; i++)      
    {
      dr = dt.Rows[i];
      listBox1.Items.Add(dr[0].ToString()+": "+dr.RowState.ToString());                      
    }
  }
5. gomb
Térjünk át most a hibaüzenetek kezelésére. Erre két lehetőségünk van: vagy a teljes sorra vonatkozó hibát adunk meg, vagy egy oszlopra vonatkozót. A hibák beállítása után a DataGrid-be megjelennek a hibát jelző kis ábrák. Egérrel ezek fölé állva, a felhasználó is olvashatja az általunk megadott hibaüzenetet. A mellékelt példában minden második sorra beállítunk egy sorra vonatkozó hibát a RowError property segítségével, valamint az első és harmadik oszlopra egy-egy hibát a SetColumnError függvénnyel.
  private void button5_Click(object sender, System.EventArgs e)
  {
    DataRow dr;
    for (int i=0; i<dt.Rows.Count; i++)      
    {
      dr = dt.Rows[i];
      if (i % 2 == 0)
      {
        dr.RowError=dr[0]+". sor hibaüzenete";
        dr.SetColumnError("c1", "c1 oszlop hibája");
        dr.SetColumnError("c3", "c3 oszlop hibája");
      }
    }
  }
6. gomb
Mind a kétféle hiba (sor, oszlop) törlését elvégezhetjük egy lépésben a ClearErrors függvény hívásával. Ezt most mi a DataTable első sorára hívjuk meg.
  private void button6_Click(object sender, System.EventArgs e)
  {
    if (dt.Rows.Count > 0)
    {
      dt.Rows[0].ClearErrors();                      
    }
    dataGrid1.Refresh();
  }
7. gomb
Utolsó példánkban a BeginEdit, CancelEdit és EndEdit függvényekre láthatunk példát, melynek a lényege, hogy a BeginEdit után megváltoztatjuk az adott sor harmadik cellájának értékét 200-ra, majd ismét ennek szeretnénk értéket adni egy osztás művelettel, melynél biztos, hogy hiba fog történni, mivel nullával próbálunk meg osztani. Így az EndEdit hívására már nem kerülhet sor, viszont a CancelEdit lefut, és ennek eredményeként az első sikeres értékadás is visszavonásra kerül, mivel az is már a BeginEdit után történt.
  private void button7_Click(object sender, System.EventArgs e)
  {
    if (dt.Rows.Count > 0)
    {
      DataRow dr=dt.Rows[0];
      dr.BeginEdit();
      try
      {
        dr[2] = 200;
        int a = 0;
        dr[2] = 100 / a;
        dr.EndEdit();
      }
      catch          
      {
        dr.CancelEdit();
        dr.SetColumnError(2, "Hiba miatt CancelEdit");
      }
    }
  }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 32. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |