1397-08-05 09:45 مشکل لود نشدن اتوماتیک dataGridView در Tab Control
booysusa

 
من یک برنامه ساده نوشتم مانند دفترچه تلفن، میخوام وقتی روی یکی از سلول های دیتاگریو کلیک می کنم کاربر به یک تب پیج دیگه بره و عملیات ویرایش روی اون انجام بشه، ولی متاسفانه هرکاری میکنم نمیشه مگر اینکه یک فرم جدید درست کنم ولی من میخوام در خود فرم اصلی و در یک تب پیج عملیات روی کاربر انجام بشه

لطفا راهنمایی کنید

کد پائین رو که نوشتم فقط باعث میشه از سطر دریتاگریدویوو به تب پیج ویرایش برم ولی هیچ اتفاقی نمی افته و هیچ کاربری انتخاب نمیشه تا ویرایش کنم مشخصاتش رو

کدهای من
public partial class frmMain : Form
{
public String FirstName { get; set; }

private void btnEdit_Click(object sender, EventArgs e)
{
frmMain frmMain = new frmMain();
frmMain.FirstName = dataGridView1.CurrentRow.Cells["ClmnFirstName"].Value.ToString();
tabControl1.SelectedTab = tabControl1.TabPages[2];
}

private void tabPage3_Click(object sender, EventArgs e)
{
txtFirstNameV.Text = this.FirstName;



اینم تصویری از برنامه من
1397-08-05 23:28
حاجی شریفی
مؤسس سایت
 
سلام
در کدی که قرار داده اید، خودتان دستی دارید هربار 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 سطر خودتان را قرار دهید.
موفق باشید و شب خوش.
1397-08-06 08:52
booysusa

 
جناب حاجی شریفی سپاسگزارم بابت توضیحاتتون
من هرکاری کردم متاسفانه نشد انجام بدم
سورس برنامه رو خدمتتون ارسال میکنم، شاید با دیدن بهتر بتونید راهنماییم کنید
یا اگر امکانش هست ویرایش کنید
http://s9.picofile.com/file/8341005468/GhazaiiElectronic.rar.html
1397-08-07 02:08
حاجی شریفی
مؤسس سایت
 
سلام
متاسفانه وقت خالی زیادی ندارم...

سه تغییر کوچک دادم:
1) بسته اصلی SQL CE را به پروژه تان اضافه کردم، اگر صحیح publish بگیرید در رایانه مقصد نیازی به نصب SQL CE نخواهید داشت وبرنامه با کپی شدن کار میکند.

2) الان فایل دیتابیس تان را از کنار exe میخواند.
هربار در VS کامپیال کنید ، خودکار فایل sdf را به کنار exe کپی میکند.
این باعث میشود بین اجراهای برنامه تان با VS هربار اطلاعات قبلی پاک شود!

ولی برای رایانه نهایی و در محیط بدون VS بهتر است.
شما قبلا مسیر مستقیم فایل sdf را داده بودید که این خوب نیست و در نصب در رایانه مقصد مشکل ساز میشود.
الان با کپی exe و sdf در کنار هم، برنامه به راحتی کار میکند.

3) بخش ویرایش را برایتان درست کردم

(لینک دانلود پروژه تان در روزهای آتی از سرور حذف میشود)
Download 6MB
موفق باشید وشب خوش.
1397-08-09 15:41
booysusa

 
بسیار سپاسگزارم جناب حاجی شریفی
استفاده کردم
سعی میکنم در انجمن چیزهایی رو که یاد گرفتم به اشتراک بزارم