سلام
در کدی که قرار داده اید، خودتان دستی دارید هربار new frmMain میکنید؟ چرا؟!
برای سطر جاری گرید از dataGridView1.CurrentRow استفاده کرده اید که روش بهتری وجود دارد،
با CurrentRow خودتان را محدود به فقط ستون های نمایش داده میکنید،
با CurrentRow باید با ایندکس ستون ها آنها را استخراج کنید و نه نام آنها!
و...
روش بهتر کار با گرید آن است که از یک شی BindingSource به عنوان میانجی استفاده کنید.
چطور؟
این شی را هم میتوانید از toolbar روی فرمتان قرار دهید و هم میتوانید در بخش کدنویسی مستقیم new و استفاده کنید.
با BindingSource میتوانید ناوبری سطرجاری گرید را کامل کنترل کنید.
استفاده اش هم راحت است.
اگر قبلا x را درون dataGridView1.DataSource میریخته اید
( چه با UIو چه در کد ) حالا x را درون bindingSource1.DataSource میریزید و bindingSource1 را درون dataGridView1.DataSource
شبیه یک میانجی
قبلا
dataGridView1.DataSource = x;
حالا
bindingSource1.DataSource = x;
dataGridView1.DataSource = bindingSource1;
البته اگر با ویزاردهای خودکار گرید را bind کرده باشید بعید نیست همین الان هم یک bindingSource1 مانندی روی فرم تان داشته باشید.
درنهایت اگر صحیح از bindingSource ها استفاده کنید، خصیصه ای دارند به نام Current که سطر اصلی منبع که bind روی آن انجام شده برمیگرداند.
اگر منبع تان DataSet و DataTable باشد مقدار Current یک DataRowView خواهد بود.
کد پیشنهادی چیزی شبیه این میشود.
//using System.Data;
private int m_EDIT_PERSON_ID = 0;
private void btnEdit_Click(object sender, EventArgs e)
{
var rowview = (DataRowView)this .bindingSource1.Current;
if (rowview == null ) return ;
var row = (DataSet1.PersonsRow )rowview.Row;
if (row == null ) return ;
this .tabControl1.SelectedIndex = 2;
this .m_EDIT_PERSON_ID = row.Person_Id;
this .textBox1.Text = row.Firstname;
this .textBox2.Text = row.Lastname;
this .textBox3.Text = row.NationalCode;
//...
}
private void btnSave_Click(object sender, EventArgs e)
{
//UPDATE [Person] ... WHERE Person_Id = this.m_EDIT_PERSON_ID
//...
}
شما باید بجای DataSet1.PersonsRow نام type سطر خودتان را قرار دهید.
موفق باشید و شب خوش.