Grafikus C# – Windows Forms tanfolyam › 2.2 lecke Windows Forms · 2.2 lecke A MiniWord eddig csak azt tudta, amit beleírtál. Most megtanítjuk fájlokat megnyitni: a felhasználó kiválaszt egy RTF vagy TXT fájlt, a program pedig megjeleníti a tartalmát. Közben azt is megnézzük, mit tegyen a program, ha a fájl nem olyan, mint amire számított.OpenFileDialog – RTF és TXT fájl megnyitása

A lecke végére
- elhelyezel egy
OpenFileDialogkomponenst, és beállítod a fájlszűrőt; - érted, mit ad vissza a
ShowDialog(), és mit tegyen a program Mégse esetén; LoadFile()segítségével megnyitsz egy RTF fájlt formázással együtt;- szöveges fájlt töltesz be a
File.ReadAllText()segítségével; - a fájl kiterjesztése alapján döntesz, hogyan nyisd meg;
- a
try–catchszerkezettel kezeled, ha a megnyitás nem sikerül.
Mielőtt elkezded
Ehhez a leckéhez kell a 2.1 lecke MiniWord projektje, valamint az if–else szerkezet és a string alapjai.
Készíts tesztfájlokat
Hogy legyen mit megnyitni, készíts a gépeden három kis fájlt, például egy Teszt nevű mappában:
szia.txt: Jegyzettömbben (Notepad) írd bele, hogyÁrvíztűrő tükörfúrógép, és mentsd el.teszt.rtf: Wordben vagy LibreOffice Writerben írj néhány mondatot, formázz meg egy szót félkövérre, majd mentsd el Rich Text Format (*.rtf) típusként.teszt.docx: ugyanezt a dokumentumot mentsd el Word dokumentumként (.docx) is.
Mit tegyél ide: a Word „Mentés másként” ablaka, amelyben a fájltípus legördülő listájából a „Rich Text Format (*.rtf)” van kiválasztva, a fájlnév mezőben pedig a teszt szó látszik.Javasolt fájlnév: winforms-2-2-rtf-mentes.webp · Alt szöveg: Dokumentum mentése Rich Text Format típusként a Wordben
Te jössz!
Készítsd el a három fájlt. Jegyezd meg, hol vannak, mert ezeket fogjuk megnyitni a MiniWord segítségével.
Az OpenFileDialog komponens
A fájlválasztó ablakot, amelyet minden programban ismersz, nem nekünk kell megrajzolni. A Windows adja, nekünk csak meg kell nyitnunk és beállítanunk. A neve OpenFileDialog.
- Nyisd meg a MiniWord projektet, és húzd az ablakra egy
Button-t:(Name):btnMegnyitas,Text:Megnyitás. Tedd a RichTextBox fölé, és ha kell, told lejjebb a szövegdobozt. - A Toolboxban nyisd ki a Dialogs csoportot, és húzd az ablakra az
OpenFileDialogelemet. - Nem az ablakon jelenik meg, hanem alul, a tervező komponenssávjában. Ez rendben van: nem látható vezérlő, csak akkor jelenik meg, amikor megnyitjuk.
- Állítsd a
(Name)tulajdonságátofdMegnyitas-ra.
Mit tegyél ide: a MiniWord Designer nézete. Fent a Megnyitás gomb, alatta a RichTextBox, az ablak alatti komponenssávban pedig az ofdMegnyitas ikon látszik. Ha tudsz, tegyél mellé egy képet a Toolbox Dialogs csoportjáról is.Javasolt fájlnév: winforms-2-2-openfiledialog-komponens.webp · Alt szöveg: Az OpenFileDialog komponens a Visual Studio tervezőjének komponenssávjában
ofd az OpenFileDialog rövidítése.Dokumentum megnyitása.C:\Teszt\teszt.rtf. Csak a kiválasztás után van értéke.A fájlszűrő: Filter
A szűrő egyetlen szöveg, amelyben párokat adunk meg függőleges vonallal (|) elválasztva: az első elem a felirat, amelyet a felhasználó lát, a második a minta, amely szerint a program szűr. Fontos, hogy mindig páros számú elem legyen.
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf|Word dokumentum (*.docx)|*.docx|Szövegfájl (*.txt)|*.txt|Minden fájl (*.*)|*.*";Jósolj!
Mit fog mutatni a fájlválasztó, amikor megnyílik, és melyik fájltípus lesz alapértelmezetten kiválasztva?
Jóslat ellenőrzése
Az első pár, tehát az RTF dokumentum lesz kiválasztva, és csak az .rtf fájlokat látod. A legördülő listából átválthatsz Word, szöveges vagy minden fájl nézetre. Az első pár helyett másikat a FilterIndex tulajdonsággal állíthatsz be alapértelmezettnek.
Mégse vagy OK?
A ShowDialog() megnyitja a fájlválasztó ablakot, és megvárja, amíg a felhasználó bezárja. Visszaadja, melyik gombbal tette: DialogResult.OK, ha a Megnyitás gombbal, és DialogResult.Cancel, ha a Mégse gombbal vagy az ablak bezárásával. Csak akkor szabad fájlt megnyitni, ha az eredmény OK.
if (ofdMegnyitas.ShowDialog() == DialogResult.OK)
{
// itt van kiválasztott fájl: ofdMegnyitas.FileName
}Mi történjen Mégse esetén?
Semmi. A felhasználó meggondolta magát, a dokumentum maradjon úgy, ahogy volt. Az if ezért csak az OK ágat tartalmazza, az else ág nem kell.
RTF és TXT betöltése
Kétféle fájlt tudunk megnyitni, és mindkettőhöz másik módszer kell:
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText) betölti a szöveget a formázásával együtt.rtbDokumentum.Text = File.ReadAllText(fajl) beolvassa a fájl teljes tartalmát szövegként, és beírja a szövegdobozba..rtf..RTF és az .rtf ugyanazt jelentse.Hogy a kódot a menüből is meg lehessen hívni (a 2.10 leckében), egy saját metódusba tesszük, amelynek a neve Megnyitas. A metódus egy névvel ellátott kódblokk: a gomb eseménykezelője csak meghívja.
private void btnMegnyitas_Click(object sender, EventArgs e)
{
Megnyitas();
}
private void Megnyitas()
{
ofdMegnyitas.Title = "Dokumentum megnyitása";
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf|Word dokumentum (*.docx)|*.docx|Szövegfájl (*.txt)|*.txt|Minden fájl (*.*)|*.*";
if (ofdMegnyitas.ShowDialog() == DialogResult.OK)
{
string fajl = ofdMegnyitas.FileName;
string kiterjesztes = Path.GetExtension(fajl).ToLower();
if (kiterjesztes == ".rtf")
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
else if (kiterjesztes == ".txt")
{
rtbDokumentum.Text = File.ReadAllText(fajl);
}
else
{
MessageBox.Show("Ezt a fájltípust a MiniWord egyelőre nem tudja megnyitni: " + kiterjesztes);
}
}
}Add hozzá a using sort!
A Path és a File osztály a System.IO névtérben él. Ha a Visual Studio aláhúzza őket, írd a fájl tetejére: using System.IO;
Miért nem LoadFile a TXT-hez is?
A LoadFile a TXT fájlt is be tudná tölteni, de az ékezetes betűk könnyen elromlanak, ha a fájl kódolása nem egyezik azzal, amit a vezérlő feltételez. A File.ReadAllText() a modern UTF-8 kódolású fájlokat helyesen olvassa. Nagyon régi, ANSI kódolású fájloknál még így is előfordulhat hibás ékezet.
Mit tegyél ide: a MiniWord a teszt.rtf megnyitása után. A félkövérre formázott szó látszik a szövegdobozban, alul pedig a „Karakterek: …” felirat. Mellette érdemes mutatni a fájlválasztó ablakot is, a típuslista lenyitva.Javasolt fájlnév: winforms-2-2-rtf-megnyitva.webp · Alt szöveg: A MiniWord egy megnyitott formázott RTF dokumentummal és a fájlválasztó típuslistájával
Ha valami elromlik: try–catch
A fájl lehet sérült, vagy egy ügyes felhasználó átnevezhet egy .txt fájlt .rtf-re. Ilyenkor a LoadFile hibával áll meg, és a program összeomlik. Erre való a try–catch: a try blokkban megpróbáljuk a kockázatos részt, ha pedig hiba történik, a catch blokk fut le a program összeomlása helyett.
try
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
catch (Exception ex)
{
MessageBox.Show("Nem sikerült megnyitni a fájlt: " + ex.Message);
}ex a hibát leíró objektum.try blokkban hiba keletkezett. Siker esetén kihagyja a program.A kivételkezelésről később, a C# alapok 4.5 leckéjében részletesen is tanulunk. Most elég annyi, hogy fájlműveleteknél érdemes használni.
Tedd a teljes fájlmegnyitó if–else if–else szerkezetet a try blokkba, a catch pedig kerüljön mögé. A mini projektben ezt a végleges kódot látod.
Ezzel a program kitartóbb lett
Hiba esetén a felhasználó érthető üzenetet kap, és a program tovább fut.
Jósolj, aztán futtasd!
Minden feladatnál először írd le, mit vársz, és csak utána próbáld ki.
1. A formázott RTF
Megnyitod a A félkövér formázás látszik, mert az RTF megőrzi. A számláló csak a látható szöveg hosszát mutatja (teszt.rtf fájlt. Látszik a félkövér szó, és mit számol a számláló?Jóslat ellenőrzése
Text.Length), a formázási jelöléseket nem számolja. A fájl megnyitása is megváltoztatja a szöveget, ezért a TextChanged esemény lefut.
2. Az ékezetes szöveg
Megnyitod a Karakterek: 22 (9 betű, szóköz, 12 betű). Ha 23-at látsz, a Jegyzettömb sortörést tett a fájl végére, ez is karakternek számít.szia.txt fájlt, amelyben az Árvíztűrő tükörfúrógép szöveg áll. Mit mutat a számláló?Jóslat ellenőrzése
3. A Word dokumentum
A típuslistából kiválasztod a Word dokumentumot, majd megnyitod a Felugrik az üzenet, hogy a .docx típust a MiniWord egyelőre nem tudja megnyitni. A szűrő csak a listát szabályozza, megnyitni a kód nyitja meg, és a RichTextBox a .docx formátumot nem ismeri. Egy .docx valójában egy tömörített mappa, amelyben XML fájlok vannak. Ennek feldolgozása külön téma.teszt.docx fájlt. Mi történik?Jóslat ellenőrzése
4. Mégse
Megnyitod a fájlválasztót, majd a Mégse gombra kattintasz. Mi történik a szövegdobozzal? Semmi: a Jóslat ellenőrzése
ShowDialog() eredménye Cancel, ezért az if blokk nem fut le.
Hibakeresés: te vagy a hibadetektív
Hibavadászat
Jósold meg, hogy fordítási hiba, futás közbeni hiba vagy rossz működés lesz-e. Csak utána nyisd le a megoldást.
1. Ismeretlen Path
string kiterjesztes = Path.GetExtension(fajl);
// The name 'Path' does not exist in the current contextHiba és javítás
Fordítási hiba (CS0103). A Path a System.IO névtérben van. Add a fájl tetejéhez: using System.IO;
2. Rossz szűrő
ofdMegnyitas.Filter = "RTF dokumentum|*.rtf|Minden fájl";Hiba és javítás
Futás közbeni hiba a ShowDialog() hívásakor: a szűrő érvénytelen. Az utolsó elemnek nincs párja, a mintája hiányzik. Javítás: "RTF dokumentum|*.rtf|Minden fájl|*.*".
3. A Mégse is hibát okoz
ofdMegnyitas.ShowDialog();
string fajl = ofdMegnyitas.FileName;
string kiterjesztes = Path.GetExtension(fajl).ToLower();Hiba és javítás
A Mégse gomb után is tovább fut a kód, de nincs kiválasztott fájl, a FileName üres, és a program a nem támogatott fájltípus üzenetét mutatja. Javítás: ellenőrizd a ShowDialog() eredményét az if (... == DialogResult.OK) szerkezettel.
4. A DOCX összeomlasztja a programot
rtbDokumentum.LoadFile(ofdMegnyitas.FileName, RichTextBoxStreamType.RichText);Hiba és javítás
Futás közbeni hiba, ha nem RTF fájlt választasz, például .docx-et: a fájl formátuma nem érvényes RTF. Két védelem is kell: a kiterjesztés vizsgálata (if–else if) és a try–catch, mert egy átnevezett vagy sérült fájl a kiterjesztés ellenére is hibás lehet.
5. Elromlott ékezetek
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.PlainText);Hiba és javítás
A szöveges fájl ékezetes betűi hibásan jelenhetnek meg, ha a kódolás nem egyezik. Használd inkább a rtbDokumentum.Text = File.ReadAllText(fajl); sort, és próbáld ki az Árvíztűrő tükörfúrógép szöveggel.
Mini projekt: a MiniWord megnyit
Bővítsd a MiniWordöt: a gomb nyissa meg a fájlválasztót, az RTF és TXT fájlok töltődjenek be, a többi fájltípusnál pedig érthető üzenet jelenjen meg. A karakterszámláló a megnyitás után is frissüljön. A Form1.cs fájlod ezzel egészül ki. Először próbáld meg önállóan megírni, és csak utána nyisd meg a megoldást. Mit tegyél ide: a nem támogatott fájltípus üzenete. A MiniWord előtt egy MessageBox látszik „Ezt a fájltípust a MiniWord egyelőre nem tudja megnyitni: .docx” szöveggel.Javasolt fájlnév: winforms-2-2-docx-uzenet.webp · Alt szöveg: A MiniWord üzenete arról, hogy a docx fájltípust még nem tudja megnyitni Ne csak futtasd: próbáld ki mindhárom tesztfájllal, a Mégse gombbal, és egy átnevezett fájllal is (például nevezd át a szia.txt fájlt szia.rtf névre, majd nyisd meg).Megoldás és ellenőrzés megnyitása
using System;
using System.IO;
using System.Windows.Forms;
namespace MiniWord
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void rtbDokumentum_TextChanged(object sender, EventArgs e)
{
lblKarakterszam.Text = $"Karakterek: {rtbDokumentum.Text.Length}";
}
private void btnMegnyitas_Click(object sender, EventArgs e)
{
Megnyitas();
}
private void Megnyitas()
{
ofdMegnyitas.Title = "Dokumentum megnyitása";
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf|Word dokumentum (*.docx)|*.docx|Szövegfájl (*.txt)|*.txt|Minden fájl (*.*)|*.*";
if (ofdMegnyitas.ShowDialog() == DialogResult.OK)
{
string fajl = ofdMegnyitas.FileName;
string kiterjesztes = Path.GetExtension(fajl).ToLower();
try
{
if (kiterjesztes == ".rtf")
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
else if (kiterjesztes == ".txt")
{
rtbDokumentum.Text = File.ReadAllText(fajl);
}
else
{
MessageBox.Show("Ezt a fájltípust a MiniWord egyelőre nem tudja megnyitni: " + kiterjesztes);
}
}
catch (Exception ex)
{
MessageBox.Show("Nem sikerült megnyitni a fájlt: " + ex.Message);
}
}
}
}
}
Önálló gyakorlófeladatok
Először készíts saját megoldást. A lenyitható rész csak ellenőrzéshez van.
1. Több szöveges típus
A MiniWord a .txt mellett a .md és .csv fájlokat is szövegként nyissa meg.Egy lehetséges megoldás
else if (kiterjesztes == ".txt" || kiterjesztes == ".md" || kiterjesztes == ".csv")
{
rtbDokumentum.Text = File.ReadAllText(fajl);
}
2. A fájl neve az ablak címében
Sikeres megnyitás után az ablak címsora legyen például MiniWord – teszt.rtf. A Egy lehetséges megoldás
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
this.Text = "MiniWord – " + Path.GetFileName(fajl);Path.GetFileName() csak a fájl nevét adja vissza, a mappa nélkül. Ugyanezt tedd a TXT ágba is.
3. A Dokumentumok mappa
A fájlválasztó a Dokumentumok mappában nyíljon meg. Az Egy lehetséges megoldás
ofdMegnyitas.InitialDirectory =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);InitialDirectory azt a mappát adja meg, amelyet a fájlválasztó először megnyit.
Gyakorlótár: 6 további feladat
Három szinten gyakorolhatsz: alap, közepes és kihívás. A feladatokhoz egy rtbDokumentum RichTextBox, egy ofdMegnyitas OpenFileDialog és egy gomb kell. A fájl elejére tedd a using System.IO; sort, ha nincs ott. Csak a próbálkozás után nyisd le a megoldást.
Alap szint
1. RTF fájl megnyitása
A A btnMegnyit gomb nyisson meg egy RTF fájlt a fájlválasztóval. A típusszűrő csak az RTF fájlokat mutassa.Megoldás megnyitása
Filter szövege párokból áll: megjelenő név|minta. A LoadFile betölti az RTF fájlt a formázással együtt.private void btnMegnyit_Click(object sender, EventArgs e)
{
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf";
if (ofdMegnyitas.ShowDialog() == DialogResult.OK)
{
rtbDokumentum.LoadFile(ofdMegnyitas.FileName, RichTextBoxStreamType.RichText);
}
}
2. A Mégse gomb
Mi történik, ha a felhasználó a fájlválasztóban a Mégse gombot nyomja? Hogyan kezeled úgy, hogy a program a Mégse után sem csinál semmit? A Megoldás megnyitása
ShowDialog() DialogResult.Cancel értéket ad vissza. Csak az OK esetén dolgozunk a fájllal, egyébként kilépünk a metódusból. Az 1. feladat kódja már így működik: az if feltétel hamis marad a Mégse esetén. Ugyanez a return-nel is megírható:if (ofdMegnyitas.ShowDialog() != DialogResult.OK)
{
return;
}
// innen folytatódik a megnyitás
Közepes szint
3. TXT fájl megnyitása
Bővítsd a szűrőt a TXT fájlokkal is. A TXT fájl tartalmát A TXT fájl nem RTF formátumú, ezért a ReadAllText töltse be (az RTF-hez használt LoadFile egyszerű szövegre nem ajánlott).Megoldás megnyitása
Text tulajdonságba olvassuk be a File.ReadAllText segítségével. A kiterjesztést a Path.GetExtension adja, a ToLower() pedig kisbetűssé alakítja, így a .TXT is felismerhető.private void btnMegnyit_Click(object sender, EventArgs e)
{
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf|Szöveges fájl (*.txt)|*.txt";
if (ofdMegnyitas.ShowDialog() != DialogResult.OK)
{
return;
}
string fajl = ofdMegnyitas.FileName;
if (Path.GetExtension(fajl).ToLower() == ".txt")
{
rtbDokumentum.Text = File.ReadAllText(fajl);
}
else
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
}
4. Hibakezelés
Védd a megnyitást Az try–catch blokkal, és külön jelezd a sérült fájlt: egy RTF kiterjesztésű, de valójában más tartalmú fájl esetén is érthető üzenet jelenjen meg.Megoldás megnyitása
ArgumentException jellemzően a hibás RTF tartalomból, az IOException a nem olvasható (például más program által zárolt) fájlból származik. A többit az általános Exception kapja el.try
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
catch (ArgumentException)
{
MessageBox.Show("A fájl nem érvényes RTF dokumentum.");
}
catch (IOException ex)
{
MessageBox.Show("A fájl nem olvasható: " + ex.Message);
}
catch (Exception ex)
{
MessageBox.Show("Váratlan hiba: " + ex.Message);
}
Kihívás szint
5. A fájl neve a címsorban
Sikeres megnyitás után az ablak címsora mutassa: MiniWord – level.rtf. A Megoldás megnyitása
Path.GetFileName a teljes útvonalból csak a fájl nevét adja vissza. A címsort (this.Text) csak sikeres betöltés után állítjuk.rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
this.Text = "MiniWord – " + Path.GetFileName(fajl);
6. Megnyitás kiterjesztés szerint
A szűrő tartalmazza az RTF, a TXT és a minden fájl lehetőséget. Az RTF és a TXT fájlt töltsd be, bármi mást jelezz hibaüzenettel (például A .docx fájlt a MiniWord nem tudja megnyitni.). A kiterjesztés alapján három ágat különítünk el. Az üzenetben a kiterjesztés is szerepel, így a felhasználó érti, miért nem nyílt meg a fájl.Megoldás megnyitása
private void btnMegnyit_Click(object sender, EventArgs e)
{
ofdMegnyitas.Filter = "RTF dokumentum (*.rtf)|*.rtf|Szöveges fájl (*.txt)|*.txt|Minden fájl (*.*)|*.*";
if (ofdMegnyitas.ShowDialog() != DialogResult.OK)
{
return;
}
string fajl = ofdMegnyitas.FileName;
string kiterjesztes = Path.GetExtension(fajl).ToLower();
try
{
if (kiterjesztes == ".rtf")
{
rtbDokumentum.LoadFile(fajl, RichTextBoxStreamType.RichText);
}
else if (kiterjesztes == ".txt")
{
rtbDokumentum.Text = File.ReadAllText(fajl);
}
else
{
MessageBox.Show($"A {kiterjesztes} fájlt a MiniWord nem tudja megnyitni.");
}
}
catch (Exception ex)
{
MessageBox.Show("Nem sikerült megnyitni a fájlt: " + ex.Message);
}
}
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Elválasztja a feliratot a mintától, és a párokat egymástól. Mindig páros számú elemnek kell lennie. Egy A szűrő csak a fájlválasztó listáját szabályozza. Hogy a fájlt a program meg tudja nyitni, azt a betöltő kód dönti el. A Csak akkor, ha a try blokkban hiba keletkezett. Hogy később több helyről, például a gombból és a menüből is meg lehessen hívni, ne kelljen kétszer megírni.1. Mit jelent a Filter szövegben a | jel?
2. Mit ad vissza a ShowDialog()?
DialogResult értéket: OK, ha a felhasználó a Megnyitás gombbal zárta be az ablakot, Cancel, ha a Mégse gombbal.3. Miért nem elég a fájlszűrő a DOCX kezeléséhez?
4. Mi a különbség a LoadFile és a File.ReadAllText között?
LoadFile RTF fájlt tölt be formázással együtt. A File.ReadAllText egy fájl tartalmát egyszerű szövegként olvassa be.5. Mikor fut le a catch blokk?
6. Miért tesszük a kódot külön Megnyitas() metódusba?
Mit tudsz már?
- Elhelyezel és beállítasz egy OpenFileDialog komponenst.
- Fájlszűrőt írsz RTF, DOCX, TXT és minden fájl típusra.
- Kezeled az OK és a Mégse eredményt.
- Megnyitod az RTF fájlt formázással, a TXT fájlt szövegként.
- A kiterjesztés alapján döntöd el, hogyan nyisd meg a fájlt.
- A try–catch szerkezettel védekezel a sérült fájlok ellen.
Következő lecke: mentés megadott néven
A MiniWord már meg tudja nyitni a dokumentumokat. A következő leckében megtanítjuk elmenteni is, a felhasználó által megadott néven, RTF formátumban.






