۱۴

DataGridView و نمایش داده‌ها 📊

یاد می‌گیریم چطور داده‌هامون رو به صورت جدول نمایش بدیم و مدیریت کنیم!

DataGridView: جدول قدرتمند داده‌ها

DataGridView یکی از پرکاربردترین کنترل‌های Windows Forms هست که بهمون اجازه می‌ده داده‌ها رو به صورت جدول نمایش بدیم. می‌تونیم داده‌ها رو از منابع مختلف مثل List، DataTable، یا دیتابیس بخونیم و نمایش بدیم.

// ایجاد DataGridView و اضافه کردن به فرم
public partial class Form1 : Form
{
    private DataGridView dataGridView;
    
    public Form1()
    {
        InitializeComponent();
        CreateDataGridView();
        LoadSampleData();
    }
    
    private void CreateDataGridView()
    {
        dataGridView = new DataGridView();
        dataGridView.Dock = DockStyle.Fill;
        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        dataGridView.MultiSelect = false;
        dataGridView.ReadOnly = false;
        dataGridView.AllowUserToAddRows = true;
        dataGridView.AllowUserToDeleteRows = true;
        
        this.Controls.Add(dataGridView);
    }
    
    private void LoadSampleData()
    {
        // ایجاد ستون‌ها
        dataGridView.Columns.Add("ID", "شناسه");
        dataGridView.Columns.Add("Name", "نام");
        dataGridView.Columns.Add("Age", "سن");
        dataGridView.Columns.Add("City", "شهر");
        
        // اضافه کردن داده‌های نمونه
        dataGridView.Rows.Add(1, "علی احمدی", 25, "تهران");
        dataGridView.Rows.Add(2, "فاطمه رضایی", 30, "اصفهان");
        dataGridView.Rows.Add(3, "محمد کریمی", 28, "شیراز");
    }
}

DataTable: مدیریت حرفه‌ای داده‌ها

DataTable یه ساختار قدرتمند برای نگهداری داده‌ها هست. می‌تونیم DataTable رو به DataGridView متصل کنیم و تمام عملیات CRUD (ایجاد، خواندن، بروزرسانی، حذف) رو انجام بدیم.

private void LoadDataWithDataTable()
{
    // ایجاد DataTable
    DataTable dataTable = new DataTable();
    
    // تعریف ستون‌ها
    dataTable.Columns.Add("ID", typeof(int));
    dataTable.Columns.Add("ProductName", typeof(string));
    dataTable.Columns.Add("Price", typeof(decimal));
    dataTable.Columns.Add("InStock", typeof(bool));
    
    // اضافه کردن داده‌ها
    dataTable.Rows.Add(1, "لپ‌تاپ ایسوس", 15000000, true);
    dataTable.Rows.Add(2, "موس لاجیتک", 250000, false);
    dataTable.Rows.Add(3, "کیبورد مکانیکی", 800000, true);
    dataTable.Rows.Add(4, "مانیتور سامسونگ", 5000000, true);
    
    // اتصال DataTable به DataGridView
    dataGridView.DataSource = dataTable;
    
    // تنظیمات ستون‌ها
    dataGridView.Columns["ID"].HeaderText = "شناسه";
    dataGridView.Columns["ProductName"].HeaderText = "نام محصول";
    dataGridView.Columns["Price"].HeaderText = "قیمت (تومان)";
    dataGridView.Columns["InStock"].HeaderText = "موجود";
    
    // فرمت قیمت
    dataGridView.Columns["Price"].DefaultCellStyle.Format = "N0";
    dataGridView.Columns["Price"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}

رویدادها و اعتبارسنجی

DataGridView رویدادهای مختلفی داره که بهمون اجازه می‌ده عملیات مختلف رو کنترل کنیم. می‌تونیم اعتبارسنجی انجام بدیم، تغییرات رو ردیابی کنیم و واکنش‌های مناسب نشون بدیم.

private void SetupDataGridViewEvents()
{
    // رویداد تغییر سلول
    dataGridView.CellValueChanged += DataGridView_CellValueChanged;
    
    // رویداد اعتبارسنجی سلول
    dataGridView.CellValidating += DataGridView_CellValidating;
    
    // رویداد کلیک روی سلول
    dataGridView.CellClick += DataGridView_CellClick;
    
    // رویداد حذف ردیف
    dataGridView.UserDeletingRow += DataGridView_UserDeletingRow;
}

private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        MessageBox.Show($"سلول ({e.RowIndex}, {e.ColumnIndex}) تغییر کرد!");
    }
}

private void DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    // اعتبارسنجی ستون قیمت
    if (dataGridView.Columns[e.ColumnIndex].Name == "Price")
    {
        if (!decimal.TryParse(e.FormattedValue.ToString(), out decimal price) || price < 0)
        {
            e.Cancel = true;
            MessageBox.Show("لطفاً یک قیمت معتبر وارد کنید!");
        }
    }
}

private void DataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    DialogResult result = MessageBox.Show("آیا مطمئن هستید؟", "حذف ردیف", 
        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    
    if (result == DialogResult.No)
    {
        e.Cancel = true;
    }
}

تمرین! 🧠

یه فرم بساز که شامل DataGridView باشه و لیست دانشجوها رو نمایش بده. هر دانشجو باید شناسه، نام، نام خانوادگی، رشته و معدل داشته باشه. دکمه‌هایی برای اضافه کردن، ویرایش و حذف دانشجو اضافه کن. همچنین اعتبارسنجی کن که معدل بین 0 تا 20 باشه.

جواب تمرین

public partial class StudentForm : Form
{
    private DataGridView dataGridView;
    private Button btnAdd, btnEdit, btnDelete;
    private DataTable studentsTable;
    
    public StudentForm()
    {
        InitializeComponent();
        CreateControls();
        SetupDataTable();
        SetupEvents();
    }
    
    private void CreateControls()
    {
        // ایجاد DataGridView
        dataGridView = new DataGridView();
        dataGridView.Dock = DockStyle.Fill;
        dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        
        // ایجاد دکمه‌ها
        Panel buttonPanel = new Panel();
        buttonPanel.Height = 50;
        buttonPanel.Dock = DockStyle.Bottom;
        
        btnAdd = new Button { Text = "اضافه کردن", Width = 100 };
        btnEdit = new Button { Text = "ویرایش", Width = 100, Left = 110 };
        btnDelete = new Button { Text = "حذف", Width = 100, Left = 220 };
        
        buttonPanel.Controls.AddRange(new Control[] { btnAdd, btnEdit, btnDelete });
        
        this.Controls.Add(dataGridView);
        this.Controls.Add(buttonPanel);
    }
    
    private void SetupDataTable()
    {
        studentsTable = new DataTable();
        studentsTable.Columns.Add("ID", typeof(int));
        studentsTable.Columns.Add("FirstName", typeof(string));
        studentsTable.Columns.Add("LastName", typeof(string));
        studentsTable.Columns.Add("Major", typeof(string));
        studentsTable.Columns.Add("GPA", typeof(double));
        
        // داده‌های نمونه
        studentsTable.Rows.Add(1, "علی", "احمدی", "کامپیوتر", 18.5);
        studentsTable.Rows.Add(2, "فاطمه", "رضایی", "برق", 17.2);
        
        dataGridView.DataSource = studentsTable;
        
        // تنظیم نام ستون‌ها
        dataGridView.Columns["ID"].HeaderText = "شناسه";
        dataGridView.Columns["FirstName"].HeaderText = "نام";
        dataGridView.Columns["LastName"].HeaderText = "نام خانوادگی";
        dataGridView.Columns["Major"].HeaderText = "رشته";
        dataGridView.Columns["GPA"].HeaderText = "معدل";
    }
    
    private void SetupEvents()
    {
        btnAdd.Click += (s, e) => AddStudent();
        btnEdit.Click += (s, e) => EditStudent();
        btnDelete.Click += (s, e) => DeleteStudent();
        
        dataGridView.CellValidating += (s, e) => {
            if (dataGridView.Columns[e.ColumnIndex].Name == "GPA")
            {
                if (!double.TryParse(e.FormattedValue.ToString(), out double gpa) || 
                    gpa < 0 || gpa > 20)
                {
                    e.Cancel = true;
                    MessageBox.Show("معدل باید بین 0 تا 20 باشد!");
                }
            }
        };
    }
    
    private void AddStudent()
    {
        int newId = studentsTable.Rows.Count + 1;
        studentsTable.Rows.Add(newId, "نام جدید", "نام خانوادگی جدید", "رشته جدید", 0.0);
    }
    
    private void EditStudent()
    {
        if (dataGridView.SelectedRows.Count > 0)
        {
            dataGridView.BeginEdit(true);
        }
        else
        {
            MessageBox.Show("لطفاً یک دانشجو انتخاب کنید!");
        }
    }
    
    private void DeleteStudent()
    {
        if (dataGridView.SelectedRows.Count > 0)
        {
            DialogResult result = MessageBox.Show("آیا مطمئن هستید؟", "حذف دانشجو", 
                MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            
            if (result == DialogResult.Yes)
            {
                dataGridView.Rows.RemoveAt(dataGridView.SelectedRows[0].Index);
            }
        }
        else
        {
            MessageBox.Show("لطفاً یک دانشجو انتخاب کنید!");
        }
    }
}