C#: meniuri și alegerea fișierelor prin dialog
Construiește un meniu C# cu deschidere de fișier și scurtătură. Tratează anularea dialogului, limitează dimensiunea și afișează erorile fără să pierzi starea.
În acest material
Alegerea fișierului trebuie să aparțină utilizatorului, fără căi personale scrise în cod. OpenFileDialog oferă selecția, dar nu garantează că fișierul va putea fi citit ulterior. Între alegere și deschidere, fișierul poate dispărea sau accesul poate fi refuzat. Formularul păstrează textul curent până la o citire reușită.
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
MenuStrip conține un meniu Fișier și comanda Deschide. ShortcutKeys asociază Ctrl+O aceleiași acțiuni, evitând două implementări. Filtrul ajută alegerea extensiei, însă validarea reală se face la citire. CheckFileExists verifică existența în dialog, fără a elimina nevoia tratării excepțiilor.
Limităm fișierul la un milion de octeți pentru acest editor didactic. Citim în variabila next, apoi actualizăm TextBox numai după succes. Anularea dialogului produce return și lasă textul intact. Datele nu sunt trimise către un server.
Exemplu și rezultat așteptat
Deschizi un fișier text cu două linii și acestea apar în editor. Redeschizi dialogul și îl anulezi: cele două linii rămân. Un fișier mai mare decât limita produce un mesaj și nu înlocuiește textul afișat. Ctrl+O trebuie să urmeze exact același flux ca meniul.
Ctrl+O sau meniu → Dialog: alegere / anulare → Citire completă în next → Succes → actualizează editorul.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 TextBox editor=new TextBox {Multiline=true,Dock=DockStyle.Fill,ScrollBars=ScrollBars.Both};
public LessonForm() {
Text="Fisier text"; ClientSize=new Size(640,360);
var menu=new MenuStrip(); var file=new ToolStripMenuItem("Fisier");
var open=new ToolStripMenuItem("Deschide") {ShortcutKeys=Keys.Control|Keys.O};
open.Click += Open; file.DropDownItems.Add(open); menu.Items.Add(file);
Controls.Add(editor); Controls.Add(menu); MainMenuStrip=menu;
}
void Open(object sender,EventArgs e) {
using(var dialog=new OpenFileDialog {Filter="Text (*.txt)|*.txt",CheckFileExists=true}) {
if(dialog.ShowDialog(this)!=DialogResult.OK) return;
try {
if(new FileInfo(dialog.FileName).Length>1000000) { MessageBox.Show(this,"Fisier prea mare."); return; }
string next=File.ReadAllText(dialog.FileName); editor.Text=next;
} catch(IOException ex) { MessageBox.Show(this,"Citirea a esuat: " + ex.Message); }
catch(UnauthorizedAccessException) { MessageBox.Show(this,"Acces refuzat."); }
}
}
}
Greșeli și limite
Nu considera filtrul o măsură suficientă de validare. Nu actualiza titlul ferestrei la un fișier nou înainte să știi că a fost deschis. Nu folosi catch gol: utilizatorul ar crede că operația a reușit. Pentru fișiere cu o codare impusă de enunț, precizează și aplică explicit acea codare.
Exersează
Verifică alegerea, anularea, fișierul gol și depășirea limitei. Adaugă o comandă Nou care golește editorul numai după confirmarea utilizatorului dacă există modificări nesalvate. Descrie stările „curat” și „modificat” și marchează exact acțiunile care schimbă această stare.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: formulare modale și salvare numai la confirmare
Lecția următoare: C#: afișarea imaginilor și eliberarea resurselor.
Referință: documentația Microsoft.
Întrebări frecvente
Filtrul garantează conținut text?
Nu. Filtrul ajută selecția, iar formatul și dimensiunea se verifică separat.
Ce fac la anularea dialogului?
Păstrez starea curentă și nu încerc să citesc FileName.
De ce citesc într-o variabilă temporară?
Ca să nu înlocuiesc datele curente înainte ca operația să reușească.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.