Nézzük a szükséges lépéseket sorra.
Tegyünk fel egy DataGrid kontrolt a web lapra, majd kattintsunk a Columns property-jére. A táblázatban megjelenő oszlopokat most manuálisan vesszük fel és nem a DataGrid-re bízzuk azok automatikus generálását. Ehhez adjunk a Selected Columns listához egy Button Column – Select és két Bound Column oszlopot.
Az első Button Column – Select típusú oszlopnál a Header Text tulajdonságnál írjuk be a Name szót. Ez lesz az oszlop tetején megjelenő felirat. Ebben az oszlopban jelenítjük meg az alkönyvtárak neveit és ezeket szeretnénk linként használni, hogy más alkönyvtárakat is ki tudjunk választani. A Text field tulajdonságnál szintén a Name szót írjuk be. Ez lesz annak a mezőnek a neve az DataGrid-hez kapcsolt adatforrásban, melynek értékeit meg kell jeleníteni ebben az oszlopban. A Button Type tulajdonságot hagyjuk az alapértelmezett LinkButton értéken, melynek hatására minden megjelenő adat egy-egy HTML link lesz.
A második, Bound Column típusú oszlopnál a Header Text és a Data Field tulajdonságnál adjuk meg a Created szót. Ebben az oszlopban az adott könyvtár létrehozási időpontját fogjuk megjeleníteni, melyet az adatforrás Created nevű mezőjéből veszünk majd.
A harmadik, szintén Bound Column típusú oszlopnál a Header Text és a Data Field tulajdonságnál adjuk meg a FullPath szót. Ebben az oszlopban az adott könyvtár teljes elérési útvonalát tároljuk, melyet az adatforrás FullPath nevű mezőjéből veszünk majd.
Ezután zárhatjuk ezt a szerkesztő ablakot. A DataGrid AutoGenerateColumns property-t feltétlenül állítsuk hamisra, mert különben a miáltalunk létrehozott oszlopok mellett megjelennek az adatforrás alapján automatikusan generált oszlopok is.
A ShowFooter property igazra állításával megjeleníthetjük a táblázat láblécét. Ennek azt a szerepet szánjuk, hogy megjelenítsük, hogy aktuálisan hány sora van a táblázatnak, vagyis hány alkönyvtára van az adott könyvtárnak.
A Properties ablakban megjelenő tulajdonságok alatt az AutoFormat... linkre kattintva választhatunk egy előre elkészített formázást a DataGrid-hez, melyet a Style kategóriában lévő property-kkel módosíthatunk, finomíthatunk.
Ennyi előkészület után nézzük, hogy mit kell tennünk a forráskódban, hogy a bevezetőben említett funkciók megvalósuljanak.
Kell először is egy globális változó, melyben DataTable típusban tároljuk a megjelenítendő adatokat, melyek dinamikusan változnak az aktuálisan kiválasztott könyvtártól függően.
private DataTable FDataTable = new DataTable("DirTable");
Létrehozunk a Page osztály Init nevű eseményéhez egy eseménykezelőt.
this.Init += new System.EventHandler(this.Page_Init);
Ennél az eseménykezelőnél adjuk meg, hogy az adatforrás milyen oszlopokat tartalmazzon. Ebből három lesz, mely mind string típusú.
private void Page_Init(object sender, System.EventArgs e)
{
FDataTable.Columns.Add(new DataColumn("Name", typeof(string)));
FDataTable.Columns.Add(new DataColumn("Created", typeof(string)));
FDataTable.Columns.Add(new DataColumn("FullPath", typeof(string)));
Hozzá is kapcsoljuk a DataGrid-hez ezt az adatforrást, mely most még nem tartalmaz adatokat.
DataGrid1.DataSource = new DataView(FDataTable);
Az első oszlop láblécének részébe elhelyezzük az Összesen szót. A későbbiekben majd a második oszlop láblécében jelenítjük meg az aktuális darabszámot.
DataGrid1.Columns[0].FooterText = "Összesen: ";
Megváltoztatjuk az első oszlop háttérszínét, hogy ezzel is kiemeljük azokat az adatokat, melyek a linkeket tartalmazzák.
DataGrid1.Columns[0].ItemStyle.BackColor = Color.Beige;
}
A következő lépéseket a Page osztály Load eseményének kezelőjében tesszük meg. Mielőtt ebbe belekezdenénk, tegyünk egy kis kitérőt. Amikor majd odajutunk, hogy könyvtárat kell váltanunk és már nem csak a C:\ tartalmát kell megjeleníteni, akkor ezt úgy jelezzük alkalmazásunk felé, hogy azt paraméterezve hívjuk meg a következő módon:
http://localhost/DataGrid03/WebForm1.aspx?newdir=c:\WINDOWS
Bevezettük tehát a newdir paramétert, mely tartalmazza annak az alkönyvtárnak az elérési útját, melyet listáznunk kell. Amikor alkalmazásunk indul, akkor természetesen ez a paraméter még nem jelenik meg, ebből tudhatjuk, hogy a C:\ tartalmára van szükség. A Load eseménykezelőben első lépésként tehát ellenőrizzük, hogy létezik-e már a newdir paraméter. Ha igen, akkor ezt a Label1 felirataként meg is jelenítjük.
private void Page_Load(object sender, System.EventArgs e)
{
string newdir = Request.QueryString["newdir"];
if (newdir != null)
{
Label1.Text = newdir;
}
DataRow row;
A Directory osztálytól kérünk egy sztring tömböt, mely tartalmazni fogja az adott elérési úton található összes alkönyvtár nevét.
string[] st = Directory.GetDirectories(Label1.Text);
Ezen a sztring tömbön végigmegyünk egy foreach ciklussal.
foreach(string s in st)
{
A ciklusmagban létrehozunk egy új adat sort, melynek mezőibe eltároljuk a szükséges adatokat: könyvtár név, létrehozási időpont, teljes elérési út.
row = FDataTable.NewRow();
row[0] = Path.GetFileName(s);
row[1] = File.GetCreationTime(s).ToString("G");
row[2] = s;
A létrehozott új sort hozzáadjuk az adatforráshoz.
FDataTable.Rows.Add(row);
}
Aktualizáljuk a második oszlop láblécének szövegét, ahol a darabszám jelenik meg.
DataGrid1.Columns[1].FooterText = st.Length.ToString() + " db";
Végső lépésként a DataBind hívásával frissítjük a DataGrid tartalmát.
Végezetül már csak egy megvalósítandó funkció marad hátra: ha a felhasználó rákattint valamely linkre az első oszlopban, akkor az ennek megfelelő alkönyvtár tartalmát kell megjelenítenünk. Ehhez a DataGrid ItemCommand eseményére lesz szükségünk.
Itt pedig nincs más tennivalónk, mint meghívni továbbra is a WebForm1.aspx-et, de most már a newdir paramétert használva, melyben megadjuk, hogy melyik alkönyvtárat kell megjeleníteni, melyet majd a Page Load eseménye dolgoz fel. A newdir paraméter értékét a DataGrid harmadik oszlopában tárolt teljes elérési útvonalból vesszük, melyet most az esemény DataGridCommandEventArgs típusú paraméteréből tudunk kiolvasni, amely tartalmazza a kiválasztott sor minden cellájának adatát.
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Response.Redirect("WebForm1.aspx?newdir=" + e.Item.Cells[2].Text);
}