فرم جدید باز شده است حالا چگونه می توان به اشیای FrmMain دسترسی داشت (مثلا TxtId را در FrmMain مقدار دهی کرد)کد://FrmMain
FrmAddCustomr FAC = new FrmAddCustomr();
FAC.ShowDialog();
Printable View
فرم جدید باز شده است حالا چگونه می توان به اشیای FrmMain دسترسی داشت (مثلا TxtId را در FrmMain مقدار دهی کرد)کد://FrmMain
FrmAddCustomr FAC = new FrmAddCustomr();
FAC.ShowDialog();
لطفا اگر کسی یاد داره کمک کنه!
سلام
شما باید اشاره گر شی ای را که میخواهید به کلاسس مورد نظر پاس دهید.
یکی یک متغییری از نوع FrmMain دررون FrmAddCustomr تعریف کرده باشید و این متغیر را مقدار دهی کنید.
سپس میتوانید از ایمن متغییر برای دستکاری شی مربوطه اش استفاده کنید.
ضمناً از نظر اصول برنامه نویسی، دسترسی یک فرم به کنترلرهای فرم دیگر صحیح نیست.
شما اگر که بخواهید از فرمی که باز کرده اید سه یا چهار خروجی داشته باشد و در فرم اولیه قرار دهید چکار می کنید؟نقل قول:
سلام
گرچه خودم همین دیروز یک مثال از دسترسی به کنترلرهای روی فرمهای دیگر برای فردی در سایت دیگری گذاشتم ولی اگر از من میپرسید، و کد نویس من باشد، هیچ گاه، تحت هیچ شرایط اجازه دسترسی به کنترلرها را از خارج از کلاسس جاری نمیدهم.
دلیلش هم ساده است، اصل نگه داری، که بر ضرورت شفاف بودن و قابل توصعه و ترمیم و تکمیل بودن و غیر اسپاگتی بودن کد تأکید میکند.
اگر چند خروجی داشته باشید، نهایتش ان است که یک کلاسس واسط، مثل یک مخزن درست میکنید تا تمام آیتم ها را باز پس دهد و غیر نهایش را هم میتوانید در خود دات نت مشاهده کنید.
شما حتماً تا حال از دیالوگ های OpenFile و SaveFile و Print و... یا InputBox و... استفاده کرده اید.
در کدام مورد ویندوز و یا دات نت اجازه دسترسی به کنترلرها را به شما داده؟؟؟؟؟؟
ولی در عین حال میتوانید تمام آیتم ها و موارد دلخواه یک OpenFileDialog را به سلیقه خود ست کنید!
خدا برکت بده به property ها! هر چندتا دوست دارید برای دریافت و بازپس دهی اطلاعات تعبیه کنید.!!!!
دوست عزیز من منظور شما را درست متوجه نشدم
ببینید
من دو تا فرم دارم FrmMain,FrmCustomer وقتی از داخل FrmMain فرم frmCustomer را باز میکنم، فرم FrmCustomer باید دارای 4 خروجی باشد (مثلا FName,LName,Id,Tel) این چهار مقدار را می خواهم در TextBox های مربوطه در FrmMain نمایش دهم.
چکار باید بکنم
این هم کل ماجرا
سلام
توجه کنید همین OpenFileDialog یک مشخصه با نام Filename داریم که به طور غیر مستقیم، شما را به کنترلرهای روی فرم وصل میکند.
مثلاً در زبان #C شما میتوانید کدی مثل زیر را در فرم تان تعبیه کنید.
یعنی به جای دسترسی به اشاره گر اصلی txtFirstName شما فقط اجازه دسترسی به خصوصیت Text آن را میدهد، آن هم به کمک خصوصیت واضح و پر معنی و گویای FirstName.کد:public string Tel
{
get
{
return this.txtTel.Text;
}
set
{
this.txtTel.Text = value;
}
}
public string FirstName
{
get
{
return this.txtFirstName.Text;
}
set
{
this.txtFirstName.Text = value;
}
}
یکی از کوچکترین خواص این کار قابلیت نگه داری بیشتر است، مثلاً لزوماً با کوچکترین تغییری در مبانی داخلی یک کلاسس، نیاز نیست کل کدهای برنامه اصلاح شود.
همچنان میتوانید به جای تک فیلدها یک نوع DataRow واحد را هم بگیرید یا باز پس دهید.
سلام
یک سئوال با محتوای متفاوت!
من در فرم اول یک DataGride دارم که وقتی کاربر یک رکورد از آن را انتخاب می کند تمام اطلاعات این DtaGride در فرم دوم (فرم ویرایش) نمایش داده می شود و کاربر اطلاعات را ویرایش می کند. حال که تعداد این فیلد ها n عدد می باشد چگونه آنها را به فرم دوم بفرستم چون نمی توان در آن فرم n عدد Property تولید کرد!
آیا می توان set || get را به حالتی تبدیل کرد که n حالت را یکجا بپذبرد؟
پیشنهاد شما چیست؟
سلام
آیا این همان آرایه خودمان نمیشود؟!نقل قول:
آیا می توان set || get را به حالتی تبدیل کرد که n حالت را یکجا بپذبرد؟
شما به راحتی میتوانید یک System.Data.DataRow و یا یک آرایه را به فرم دوم تحویل بدهید.
سلام
لطفا در مورد طریقه ساخت DateRow و طریقه بکار گیری آن توضیح بفرمایید؟(مقدار دهی به آن و مقدار گیری از آن (فیلدهایی از نوع Int,String,...))
ممنون
سلام
یک سوال کلی:
من در فرم اول یک DataGride دارم که وقتی کاربر یک رکورد از آن را انتخاب می کند تمام اطلاعات این DtaGride در فرم دوم (فرم ویرایش) نمایش داده می شود و کاربر اطلاعات را ویرایش می کند.
این n فیلد را چگونه به فرم دوم بفرستم؟
پیشنهادات:
1. تمام TextBoxهایی که در فرم دوم قرار است اطلاعات را نمایش دهد را Public کنم و از فرم اول آنها را مقدار دهی کنم
2. یک آرایه Public از نوع String در فرم دوم ایجاد کنم و تمام خانه های آن را مقدار دهی کنم و در رویداد Load فرم دوم مقادیر این آرایه را در TextBoxها بریزم
3. Id فردی که انتخاب شده است را به فرم دوم بفرستم و در رویداد Load فرم دوم از دیتابیس مقادیر را بخوانم و در TextBoxها وارد کنم
4. ...
شما از چه روشی استفاده میکنید؟
پبشنهاد شما چیست؟
با سلام خدمت دوستان عزیز
ببخشید که پا برهنه می پرم وسط حرف بزرگتر ها.
دوست عزیز من فکر میکنم (البته من خیلی کم تجربه و تازه کارم) که اصلا از خیر فرم دوم بگذری و اطلاعات رو توی همون فرم اول دستکاری کنی.
دوم اینکه به نظر من اگه اطلاعات رو به طور مستقیم از بانک داده بگیری و ادیت کنی و دوباره به بانک داده بفرستی کار منطقی تری هستش چون شما به هر حال باید بعد از ارسال اطلاعات به فرم اول باید بانک داده رو به روز آوری کنی پس چه بهتر که این کار بی واسطه انجام بشه .
البته اگه فرمان های مربوط به دریافت اطلاعات و همچنین فرمان های مربوط به به روز رسانی اطلاعات رو در یک کلاس جداگانه تعریف کنی کلا کارت راحت میشه و از هر فرمی که دلت میخواد میتونی بی واسطه به بانک داده دسترسی داشته باشی و در این صورد در نهایت شاید فقط لازم باشه که یک یا دو متغیر رو بین فرم هات به اشتراک بزاری و این طوری خوانایی برنامه هم بسیار بالا میره.
سلام
به طور معمول یک DataRow تکی قابل تولید نیست، یعنی باید یک DataTable داشته باشید که از اعضای Rows آن استفاده کنید و یا یک NewRow بسازید.نقل قول:
لطفا در مورد طریقه ساخت DateRow و طریقه بکار گیری آن توضیح بفرمایید؟(مقدار دهی به آن و مقدار گیری از آن (فیلدهایی از نوع Int,String,...))
یعنی با کدهای شبیه این قابل به دست آوردن است...
و با کدهایی شبیه این قابل دسترسی و ویرایش است.کد:System.Data.DataRow dr;
dr = datatablename.Rows[0];
dr = datatablename.NewRows();
dr = datasetname.Tables[0].Rows[0]
//...
//TypedDataSet
DataSetName.DataTableRowName dr;
dr = typeddatatablename[0];
dr = typeddatatablename.NewRowName;
dr = typeddatasetname.TableName[0];
//...
کد:dr[0] = 110;
dr[1] = "Mahdi";
dr["columnname1"] = 14;
dr["columnname2"] = new System.DateTime(2009, 3, 1);
x = dr[1] as string;
y = (int)dr["columnname1"];
//TypedDataSet
dr[0] = 110;
dr[1] = "Mahdi";
dr["columnname1"] = 14;
dr.ColumnName1 = 14;
dr["columnname2"] = new System.DateTime(2009, 3, 1);
dr.ColumnName2 = new System.DateTime(2009, 3, 1);
x = dr[1] as string;
y = (int)dr["columnname1"];
z = dr.ColumnName3;
1) بدترین راه ممکن!نقل قول:
من در فرم اول یک DataGride دارم که وقتی کاربر یک رکورد از آن را انتخاب می کند تمام اطلاعات این DtaGride در فرم دوم (فرم ویرایش) نمایش داده می شود و کاربر اطلاعات را ویرایش می کند.
این n فیلد را چگونه به فرم دوم بفرستم؟
1. ...
2. ...
3. ...
2) اگر تمام فیلدها از یک نوع باشند شاید قابل قبول باشد.
3) بد نیست ولی یک خواندن در فرم دوم میخواهد و یکی هم در فرم اول، برای سرعت بهتر است انجام نشود.
من اگر میخواستم در یک فرم دیگر این کار را انجام دهم و شرایط شما را داشتم بدون شک از همین DataRow استفاده میکردم.نقل قول:
شما از چه روشی استفاده میکنید؟ پبشنهاد شما چیست؟
چون حتماً منبع تغذیه Grid شما یک DataTable است؟
با فرستادن سطر DataRow نظیر در DataTable، ضمن اینکه همه فیلدها را فرستاده اید، اگر در فرم دوم ویرایشی روی DataRow انجام دهید یا متد Delete آن را (نظیر یک دکمه "حذف" روی فرم دوم) اجرا کنید در هر دو صورت بدون کد و کار اضافه ای تغییرات در گراید در همان لحظه اعمال خواهد شد.
موفق باشید.
سلام
من یک متغیر Public در فرم دوم تعریف کردم
\\FrmCustomer
public System.Data.DataRow Dr;
بعد زمانی که کاربر یک نفر را از DataGride انتخاب می کند با این دستور اطلاعات را از فرم اول به فرم دوم میفرستم
\\FrmShowCustomer
FC.Dr = markazDBDataSet.Customer.Rows[0];
سپس در رویداد Load فرم دوم textBox ها را مقدار دهی می کنم
TxtId.Text = Dr["CoId"].ToString();
TxtFName.Text = Dr["FName"].ToString();
TxtLName.Text = Dr["LName"].ToString();
.
حال:
1. چگونه فرد انتخاب شده را به فرم دوم بفرستم (بجای 0 چه چیزی بنویسم؟)
FC.Dr = markazDBDataSet.Customer.Rows[0];
2. دستورات مقدار دهی به TextBoxها را در رویداد Load فرم نوشته ام. اگر تعداد این دستورات زیاد باشد، سرعت اجرای برنامه گرفته نمی شود؟
سلام
بله از روشهای قبلیتان بهتر است و قابل بهتر شدن هم است...نقل قول:
من یک متغیر Public در فرم دوم تعریف کردم
تمام فیلدهای شما متنی است؟نقل قول:
. دستورات مقدار دهی به TextBoxها را در رویداد Load فرم نوشته ام. اگر تعداد این دستورات زیاد باشد، سرعت اجرای برنامه گرفته نمی شود؟
نه مشکل خاصی ندارد... معمولاً جاهایی سرعت کم میشود که کاری در حلقه به تعداد مکرر انجام شود.
یک کامپونت BindingSource روی فرمتان قرار دهید و DataSource و DataMember اش را تایین کنید.نقل قول:
. چگونه فرد انتخاب شده را به فرم دوم بفرستم (بجای 0 چه چیزی بنویسم؟)
سپس خود این BindingSource را به عنوان Source به Grid بدهید.
حال هر زمان سطرجاری فعال در گراید را میخواهید با دستور زیر قابل تحصیل است:
کد:System.Data.DataRow dr = ((System.Data.DataRowView)this.BindingSource1.Current).Row;
لطفا راه حل بهتر آن را نیز بفرمایید!نقل قول:
منظور شما چیست؟نقل قول:
فیلدهای معمولی مثل Id,FName,LName,... که در TextBox ها نمایش داده می شود!
sghl
اگر من بودم و فقط همین یک DataRow را برای انتقال داشتم، کد زیر را از نظرهای مختلف ترجیح میدادم.نقل قول:
لطفا راه حل بهتر آن را نیز بفرمایید!
(البته من کد فوق را ساده کرده ام، ولی شما فراموش نکنید در شرایط خاص امکان دارد مقادیر null باشند و شما باید این شرط را همواره در کدنویسی های خود مدنظر داشته باشید و برای آن if های مطلوبی قرار دهید.)کد:public class Form2
: System.Windows.Forms
{
private System.Data.DataRow m_DataRow;
public Form2(System.Data.DataRow dr)
{
this.InitializeComponent();
this.m_DataRow = dr;
this.txtName.Text = this.m_DataRow[0].ToString();
//...
}
.....
//Form1 ... Event
System.Data.DataRow dr = ((System.Data.DataRowView)this.BindingSource1.Current).Row;
using(Form2 f = new Form2(dr))
{
f.ShowDialog(this);
}
خوب برای فیلدهای متنی TextBox مناسب استنقل قول:
منظور شما چیست؟
فیلدهای معمولی مثل Id,FName,LName,... که در TextBox ها نمایش داده می شود!
برای فیلدهای عددی NumericUpDown ...
برای فیلدهای تاریخی یک کنترلر تاریخی فارسی ...
برای فیلدی حاوی یک تصویر یک PictureBox با چند دکمه و راست کلیک ...
و ...
موفق باشید.
سلام
زمانی که فرم2 برای ویرایش اطلاعات باز میشود از این دستورات استفاده میشود(یعنی با این دستورات این سطر را به فرم دوم میفرستیم)
و پس از آن مقدار ها را نمایش می دهمکد:System.Data.DataRow dr = ((System.Data.DataRowView)this.BindingSource1.Current).Row;
Form2 f = new Form2(dr)
اما زمانی که فرم دوم برای ثبت یک مشتری جدید باز میشود باید چکار کنم؟
آیا باید از این دستور استفاده کنم؟
چگونه در فرم دوم تعیین کنم که این فرم برای ویرایش اطلاعات بازشده است یا برای ثبت اطلاعات جدید؟کد:Form2 f = new Form2(null)
سلام
اینکه خیلی ساده است!!!!!
برای دکمه های OK/Save و Cancel/Exit در فرم ویرایشی دوم خصیصه DialogResult را پر کنید.
و در رویداد OK/Save مقادیر کنترلرها را داخل m_DataRow بریزید.
در واقع فرق برای update و insert نخواهد داشت! و فرم اول باید دستورات مختلفی اجرا کند.
دستور Update در فرم اول چنین خواهد شد:
دستور Insert در فرم اول هم چنین خواهد شد:کد:System.Data.DataRow dr = ((System.Data.DataRowView)this.BindingSource1.Current).Row;
using(Form2 f = new Form2(dr))
{
f.ShowDialog(this);
}
این نمونه ای از تعامل منطقی دو فرم است، که هیچیک به متغییرها و کنترلرهای یکدیگر دسترسی ندارند و هر کدام در داخل کد خود مستقل هستند و با انجام تغییرات داخل Form1 و Form2 کد دیگری نیاز به تغییر خاصی نخواهد داشت و این از اصول برنامه نویسی است و قابلیت "نگه داری کد" را به شدت افزایش میدهد و از پیدایش کدهای اسپاگتی مانند جلوگیری میکند.کد:System.Data.DataRow dr = datatablename.NewRow();
using(Form2 f = new Form2(dr))
{
if (f.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
{
datatablename.Rows.Add(dr)
}
}
(مجدداً تاکید میکنم null بودن مقادیر را بررسی کنید)
موفق باشید.
سلام
ممنون از پاسخ شما اما شرمنده، منظور بنده را متوجه نشدید!
ببینید من این دستورات را در فرم دوم نوشته ام
فرم دوم دو حالت برای باز شدن داردکد:public FrmCustomer(System.Data.DataRow dr)
{
InitializeComponent();
TxtId.Text = dr["CuId"].ToString();
TxtTime.Text = dr["Time"].ToString();
TxtDate.Text = dr["Date"].ToString();
TxtFName.Text = dr["FName"].ToString();
...
{
1. حالت اضافه کردن (اطلاعاتی لازم نیست به این فرم فرستاده شود)
2. حالت ویرایش (اطلاعات یک سطر باید به این فرم فرستاده شود)کد:FrmCustomer FCu = new FrmCustomer(null);
برای حالتی که فرم برای ویرایش اطلاعات باز میشود دستورات بالا باید اجرا شود اما برای حالتی که فرم برای ثبت اطلاعات جدید باز میشود این دستورات نباید اجرا شود!کد:System.Data.DataRow dr = ((System.Data.DataRowView)this.customerBindingSource.Current).Row;
FrmCustomer FCu = new FrmCustomer(dr);
این دو حالت را چگونه می توان تفکیک کرد؟
چون برای حالت اول این دستورات با خطا مواجه میشود!
باز هم شرمنده!!!
راستی منظور شما از چک کردن Null بودن مقادیر چیست؟
آیا این دستور مشکلی دارد؟
TxtFName.Text = dr["FName"].ToString();
این فیلد یا مقدار دارد یا ندارد!!!
اگر مقدار داشته باشد مقدار آن نمایش داده می شود و اگر مقدار نداشته باش چیزی نمایش داده نمی شود!
سلام
اگر دستورات فرم دوم شما کامل و دقیق بودند، نباید خطایی پیش می آمد!نقل قول:
چون برای حالت اول این دستورات با خطا مواجه میشود!
شما در هر صورت و حتی زمان Insert هم بحرحال باید یک DataRow به فرم دوم ارسال کنید!
تا فرم دوم بتواند این DataRow را با مقادیر ورودی کاربر پر کند.
==============
دستور فرم دوم شما باید چنین باشد...
==============کد:public class Form2
: System.Windows.Forms
{
private System.Data.DataRow m_DataRow;
public Form2(System.Data.DataRow dr)
{
this.InitializeComponent();
this.m_DataRow = dr;
if (this.m_DataRow != null)
{
this.txtName1.Text = this.ConvertToString(this.m_DataRow[0]);
this.txtName2.Text = this.ConvertToString(this.m_DataRow[1]);
//...
}
}
private string ConvertToString(object value)
{
if((value == null) || (value == System.DBNull.Value)) return string.Empty;
return value.ToString();
}
//...
تابع ConvertToString نوشته شده در فوق اطمینان بیشتری به همراه دارد.نقل قول:
آیا این دستور مشکلی دارد؟
TxtFName.Text = dr["FName"].ToString();
اگر مقدار یک فیلد null باشد و شما متد ToString را روی آن اجرا کنید با خطای زمان اجرا روبرو میشود.نقل قول:
اگر مقدار داشته باشد مقدار آن نمایش داده می شود و اگر مقدار نداشته باش چیزی نمایش داده نمی شود!
البته این وضعیت در فیلدهای دیتابیس خیلی بعید است، چون اغلب موارد به جای null حاوی DBNull هستند که مشکلی ایجاد نمیکند ولی کار از محکم کاری عیب نمیکند!
(محکم کاری میتواند ضامن آبرو حرفه ای شما در حین آزمایش عملی برنامه جلو مشتری باشد!!!)
==============
دستور Update در فرم اول چنین خواهد شد: (با شرایط محکم کاری!)نقل قول:
راستی منظور شما از چک کردن Null بودن مقادیر چیست؟
(یعنی من اگر بودم کدی شبیه این مینوشتم!)
دستور Insert در فرم اول هم، همان آخرین کد خوب است و ایراد خاصی ندارد.کد:if ((datatablename.Rows.Count <= 0) || (this.BindingSource1.Count <= 0)) return;
object obj = this.BindingSource1.Current;
if(obj == null) return;
System.Data.DataRow dr = ((System.Data.DataRowView)obj).Row;
if(dr == null) return;
using(Form2 f = new Form2(dr))
{
f.ShowDialog(this);
}
(دیگر فرض میکنیم در هیچ زمان امکان ندارد datatablename و BindingSource1 بتوانند خالی و null باشند.)
ضمنا سعی کنید از دستور using هم بیشتر استفاده کنید!
==============
فرم دوم شما نیاز ندارد تفاوت این دو حالت را بداند و در هر صورت باید یک DataRow صحیح تحویل بگیرد (نباید null بفرستید)نقل قول:
این دو حالت را چگونه می توان تفکیک کرد؟
تا بعد از کلیک دکمه OK/Save تغییرات را در DataRow اعمال کند. (در هر دو صورت Update و Insert) و با کدهای فوق دیگر مشکلی نباید داشته باشید.
ولی اگر خیلی اصرار دارید این حالت را به فرم دوم اطلاع دهید تنا کد خاص دیگری را اجرا کنید، میتوانید بعد از DataRow یک پارامتر bool هم ارسال کنید که این دو حالت را از هم تمیز دهد.
==============
موفق باشید.
سلام
شرمنده من اینقدر سئوال میپرسم!
چندتا سئوال کوچیک دیگه!
اول:
چرا؟نقل قول:
ضمنا سعی کنید از دستور using هم بیشتر استفاده کنید!
مثلا تفاوت بین این دستور شما با دستور من چیست؟
دوم:کد:using(Form2 f = new Form2(dr))
Form2 f = new Form2(dr)
تفاوت این دستور شما با دستور من چیست؟
چرا همه جا از دستور This استفاده کرده اید؟
سوم:کد:f.ShowDialog(this);
f.ShowDialog();
یعنی برای Delete چه چیزی بنویسم؟نقل قول:
با فرستادن سطر DataRow نظیر در DataTable، ضمن اینکه همه فیلدها را فرستاده اید، اگر در فرم دوم ویرایشی روی DataRow انجام دهید یا متد Delete آن را (نظیر یک دکمه "حذف" روی فرم دوم) اجرا کنید در هر دو صورت بدون کد و کار اضافه ای تغییرات در گراید در همان لحظه اعمال خواهد شد.
برای Edit چه چیزی بنویسم؟
من برای Ins,Upd,Del هر کدام یک StoredProcedure درست کرده ام و از آنها استفاده می کنم. شما میفرمایید از آنها استفاده نکنم؟
این روش چه مزیتی نسبت به کار با Sp ها دارد؟
چهارم:
فرم دوم توسط دو جدول پر میشود
جدول1: مشخصات مشتری شامل فیلد کلید، نام، نام خانوادگی، ...
جدول2: جدول تلفن شامل فیلد کلید، تلفن1، تلفن2، ...
طبق راهنمایی شما من سطر انتخاب شده توسط DataGride که DataSource آن روی جدول اول تنظیم شده است را به فرم دوم میفرستم، حال چگونه اطلاعات جدول دوم را نیز به آن بفرستم؟(در فرم دوم یک ListBox وجود دارد که تلفنهای ثبت شده این فرد در آن نمایش داده میشود)
ممنون از پاسخ های شما
واقعا شرمنده من اینقدر شما را اذیت می کنم
سلام
forum.p30world.com/showthread.php?p=1556644#post1556644نقل قول:
... using ...
چرا؟
مثلا تفاوت بین این دستور شما با دستور من چیست؟
this در هر زمان و در هر کلاس به همان کلاسی که داخلش هستیم اشاره میکند (معادلش در VB لغت Me است)نقل قول:
چرا همه جا از دستور This استفاده کرده اید؟
در بیشتر مواردی که در کدهای من دیده اید، برای مشخص کردن شی مالک اشیا بوده...
در واقع به نظر من خوانایی را به شدت افزایش میدهد.
مثلاً وقتی همینطوری مینویسید BindingSource1.Current این تردید به وجود می آید که BindingSource1 یک متغییر محلی است؟ پارامتری است که به تابع پاس داده شده؟ یک شی static عمومی و همگانی است؟ یا یک شی است که در سطح مالزول تعریف شده؟
ولی this.BindingSource1.Current تمام شک و تردیدها را برطرف میکند و کامللاً مشخص است که شی مذکور غیر static است و در سطح مازول کلاس جاری که در آن هستیم تعریف شده.
دریافت سریع و با یک نگاه این مطلب ضمن افزایش خوانایی و نیاز کمتر به توضیح نویسی، جلوی برخی اشتباه هات و خطاها را میگیرد و میتواند سرعت کد نویسی را افزایش دهد (فوراً متوجه میشوم که میتوانم این شی را در تمام توابع دیگر همان کلاس هم استفاده کنم و حق استفاده از ان را در متدهای static ندارم) ضمن اینکه در زمان تایپ نام وارد کردن this و زدن نقطه لیست مقادیر مجاز همین حوزه نشان داده میشود که محدوده کوچکتری است و سریعتر میتوان نام مورد نظر را در ان یافت.
ولی دستور فوق کمی فرق داردف وقتی میخواهید یک فرم دیگر را باز کنید میتوانید یک فرم را به عنوان مالک آن فرم معرفی کنید...نقل قول:
چرا همه جا از دستور This استفاده کرده اید؟
;(f.ShowDialog(this
وچون برنامه شما در طی دو فرم و یک ریسمان اجرا میشود نوشتن this و ننوشتن ان برای متد ShowDialog تفاوتی ایجاد نمیکند ولی با این وجود باز هم ضمن افزایش خوانایی کد هم محکمتر خواهد شد و مثلاً اگر بعداً برنامه چند را یک دفعه چند ریسمانی هم کنید باز مالک فرم به درستی حفظ خواهد شد.
نقل قول:
یعنی برای Delete چه چیزی بنویسم؟
کد:dr.Delete();
نقل قول:
برای Edit چه چیزی بنویسم؟
کد:dr[0] = 123;
کاملاً بد متوجه شدید!نقل قول:
من برای Ins,Upd,Del هر کدام یک StoredProcedure درست کرده ام و از آنها استفاده می کنم. شما میفرمایید از آنها استفاده نکنم؟
این روش چه مزیتی نسبت به کار با Sp ها دارد؟
این روشها و کدها آفلاین است و فقط در سطح DataSet و DataTable اعمال میشود و در گراید قابل مشاهده است...
در نهایت برای اعمال قطعی انها در دیتابیس باید از DataAdapter و متد Update استفاده کنید.
مثل متد Fill که استفاده کرده اید و دیتاها را از دیتابیس خوانده و در DataSet ذخیره کرده... حالا DSataSet آفلاین استف شما میتوانید چیزی از آن حذف و اضافه و تغییر دهید و بعد با متد Update برعکس Fill عمل کنید و دیتابیس را آپدیت کنید.
استفاده از SP ها بسیار منطقی است، شما میتوانید در فرامین Update و Insert و Delete در DataAdapter از SP ها استفاده کنید تا DataAdapter.Update بر اساس آن کار کند.
(
با این یک سوال من متوجه شدم که احتمالاً کمی پایه ای مشکل دارید ...
پیشنهاد میکنم کتاب یا جزوه ای در خصوص ADO.Net را حتماً مطالعه کنید تا اصول دیتابیس را در دات نت پایه ای یادبگیرید و مشکلتان برای همیشه ریشه کن و حل شود، چون بحرحال من هر چه توضیح دهم نمیتوانم اندازه یک کتاب 100 یا 300 صفحه ای توضیح دهم و کتاب فضا و امکانات بیشتری برای شرح و بست دارد.
)
یعنی یک فرم شماف همزمان دو جدول را ویرایش میکند؟نقل قول:
طبق راهنمایی شما من سطر انتخاب شده توسط DataGride که DataSource آن روی جدول اول تنظیم شده است را به فرم دوم میفرستم، حال چگونه اطلاعات جدول دوم را نیز به آن بفرستم؟(در فرم دوم یک ListBox وجود دارد که تلفنهای ثبت شده این فرد در آن نمایش داده میشود)
خوب اطلاعات مورد نیاز دیگر را هم مثل همان DataRow بفرستید!
موفق باشید.
سلام
به توصیه شما در مورد Ado یک فایل Pdf حدود 200 صفحه ای را مطالعه کردم (ممنون از توصیه بجا و عالی شما)!نقل قول:
با این یک سوال من متوجه شدم که احتمالاً کمی پایه ای مشکل دارید ...
پیشنهاد میکنم کتاب یا جزوه ای در خصوص ADO.Net ...
حالا چند تا سئوال دارم؟
1.
زمانی که این دستور را استفاده میکنیمنقل قول:
من برای Ins,Upd,Del هر کدام یک StoredProcedure درست کرده ام و از آنها استفاده می کنم. شما میفرمایید از آنها استفاده نکنم؟
این روش چه مزیتی نسبت به کار با Sp ها دارد؟
مگر اطلاعات در DataSet (دیتابیس مجازی یا آفلاین) قرار نمیگیرد و برای تثبیت ان در دیتابیس از دستورکد:dr[0] = 123;
dr.endedit();
نباید استفاده کرد؟کد:NameTableAdapter.Update(NameDBDataSet.TableName);
و برای Delete از
استفاده کنم؟کد:NameBindingSource.RemoveCurrent();
NameTableAdapter.Update(NameDBDataSet.TableName);
و ...
خوب، با این کار Sp های Ins,Upd,Del که برای تمام جدولها نوشته ام دیگر کاربردی ندارد!
در حالی که شما در پاسخ به سئوال من فرموده بودید که
2. سئوال دوم در مورد دستور Using:نقل قول:
کاملاً بد متوجه شدید!
منظور شما را از
متوجه نشدم!نقل قول:
1- چون Using باید روی اشاره گر شی قفل کند، در نتیجه باید در همان خط اول شی نمونه سازی شود و پر شود و این امر را نمیتوان به خطوط بعد محول کرد و اصلاً اشاره گر شی در بدنه Using در حالت ReadOnly قرار دارد و نمیتوانید چیزی در آن بریزید.!
2- شی مورد نظر باید واسط نابودسازی را همراه داشته باشد (System.IDisposable) یعنی برای هر نوعی که واسط مذکور را شامل نشود نمیتوان از Using استفاده کرد.
به عنوان مثال من یک کلاس با نام ChekNull دارم و در آن دو تابع ...
زمانی که از دستور
استفاده می کنم با خطا مواجه می شودکد:using (ChekNull CN=new ChekNull())
}...{
اگه امکان داره دوتا قانون رو بیشتر توضیح بفرمایید!
3. سئوال سوم هم همون سئوال پست قبلی
نقل قول:
فرم دوم توسط دو جدول پر میشود
جدول1: مشخصات مشتری شامل فیلد کلید، نام، نام خانوادگی، ...
جدول2: جدول تلفن شامل فیلد کلید، تلفن1، تلفن2، ...
طبق راهنمایی شما من سطر انتخاب شده توسط DataGride که DataSource آن روی جدول اول تنظیم شده است را به فرم دوم میفرستم، حال چگونه اطلاعات جدول دوم را نیز به آن بفرستم؟(در فرم دوم یک ListBox وجود دارد که تلفنهای ثبت شده این فرد در آن نمایش داده میشود)
ببینید من باید تمام تلفنهای این شخص را به فرم دوم بفرستم(یعنی یک رکورد از جدول اول و n رکورد از جدول دوم)و آنها را در ListBox نمایش دهم!کد:System.Data.DataRow dr = ((System.Data.DataRowView)this.customerBindingSource.Current).Row;
چگونه تلفنهای این شخص را بدست آورم و در ListBox نمایش بدم؟
سلام
مشکل شما آنجا است که با چند کلیک و در ساده ترین شکل و بدترین حالت ممکن DataAdapter را تولید میکنید.نقل قول:
خوب، با این کار Sp های Ins,Upd,Del که برای تمام جدولها نوشته ام دیگر کاربردی ندارد!
در ویزارد ها هم اگر دقت کنید، گزینه هایی دارد که اجازه میدهد Command های UPDATE و DELETE و INSERT و SELECT را به جای دستورات مستقیم SQL به SP های از قبل آماده وصل کنید.
اتفاقاً بهترین حالت همین است، یعنی اگر هم مجبور به استفاده از DataSet و DataAdapter شدید، حداقل DataAdapter ها را برای بهترین حالت بهینه کنید و آنها را به SP های از قبل آماده وصل کنید.
قانون اول که خیلی ساده است !!!نقل قول:
به عنوان مثال من یک کلاس با نام ChekNull دارم و در آن دو تابع ...
استفاده می کنم با خطا مواجه می شود
اگه امکان داره دوتا قانون رو بیشتر توضیح بفرمایید!
یعنی دستور اول زیر صحیح است ولی دستورات دوم ایراد دارد.
قانون دوم هم ساده است، باید کلاسس شما واسط IDisposable را داشته باشد!کد:using(Tyep x = new Type())
{
//...
}
using(Tyep x)
{
x = new Type();
//...
}
مگر وراثت و پلی مورفیزم را بلد نیستید؟؟؟
کد:public class Class1
: IDisposable
{
public void Dispose()
{
//...
System.GC.SuppressFinalize(this);
}
}
واقعاً با این مسائل مشکل دارید؟ کمی فکر کنید، این راه حل ها را بدون شک میدانید ...نقل قول:
چگونه تلفنهای این شخص را بدست آورم و در ListBox نمایش بدم؟
شما یا میتوانید یک DataSet را ارسال کنید تا در محل ----- شود یا یک DataView ارسال کنید یا میتوانید در همان فرم و در همان محل اطلاعات را با توجه به شخص داده شده از دیتابیس استعلام کنید.
موفق باشید.
سلام
ببینید من دو تا جدول دارم:
در جدول اول مشخصات اولیه قرار دارد و در جدول دوم مشخصات ثانویه
کاربر از روی دیتا گرید که به جدول اول متصل شده است فرد مورد نظر را انتخاب میکند اما در فرمی که برای ویرایش اطلاعات باز می شود با اطلاعات جدول اول کاری نداریم و اطلاعات جدول دوم را باید به این فرم بفرستیم
چگونه اطلاعات جدول دوم را به فرم ویرایش بفرستم؟
من با این دستورات اطلاعات این مشتری را در جدول دوم بدست می اورم اما
چگونه آن را به System.Data.DataRowView تبدیل کنم تا آن را به فرم دیگر بفرستم؟کد:string myConnectionString = Properties.Settings.Default.ConnectionString;
using (System.Data.SqlClient.SqlConnection dbCon = new System.Data.SqlClient.SqlConnection(myConnectionString))
{
using (System.Data.SqlClient.SqlCommand dbCom = new System.Data.SqlClient.SqlCommand("SELECT * FROM Period WHERE ([Id] = @Id);", dbCon))
{
dbCom.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Id", FSP.PeId_Value));
dbCon.Open();
using (System.Data.SqlClient.SqlDataReader dbDr = dbCom.ExecuteReader())
{
if (dbDr.Read())
{
چیزی مثل این :
[[CODE]System.Data.DataRow dr = ((System.Data.DataRowView)this.periodBindingSource .Current).Row;[/CODE
Please Help Me!
سلام
حالا قرار نیست حتما همیشه DataRowView باشد !!!نقل قول:
چگونه آن را به System.Data.DataRowView تبدیل کنم تا آن را به فرم دیگر بفرستم؟
پیشنهاد میکنم فقط و فقط عدد primarykey (احتمالاً همین FSP.PeId_Value) را برای فرم دوم بفرستید و فرم دوم خودش با DataReader اطلاعات را همانجا استخراج و مصرف کند.نقل قول:
در جدول اول مشخصات اولیه قرار دارد و در جدول دوم مشخصات ثانویه
کاربر از روی دیتا گرید که به جدول اول متصل شده است فرد مورد نظر را انتخاب میکند اما در فرمی که برای ویرایش اطلاعات باز می شود با اطلاعات جدول اول کاری نداریم و اطلاعات جدول دوم را باید به این فرم بفرستیم
چگونه اطلاعات جدول دوم را به فرم ویرایش بفرستم؟
(البته اگر کارهالی دیتابیسی به لایه مخصوصی برای اینکار محول شود خیلی بهتر است که فعلاً این بحث شما نیست !)
موفق باشید.
سلام
من قبلا از روشهای دیگری برای اضافه کردن، حذف کردن، ویرایش کردن دیتابیس استفاده می کردم اما از زمانی که شما پیشنهاد حرفه ای استفاده از DataRow را ارائه فرمودید سعی کردم که کل برنامه را با این روش اصلاح کنم اما در پیاده سازی آن دچار مشکل شدم
اگر یک مشتری جدید بخواهم ثبت کنم از این دستور استفاده می کنم
...NewRow
ویا اگر بخواهم اطلاعات یک مشتری را ویرایش کنم از این دستور استفاده می کنم
System.Data.DataRow dr = ((System.Data.DataRowView)this.BindingSource1.Curr ent).Row;
که در هر دو صورت یک DataRow به فرم دوم هنگام New کردن آن ارسال میشود و فرم دوم فقط و فقط همین DataRow را به عنوان پارامتر می پذیرد و هیچگونه پارامتر دیگری ندارد(از تولید N پارامتر بی خاصیت جلوگیری میشود)
حال اگر فیلد کلید این مشتری در فرم اول موجود باشد و بخواهیم اطلاعات جدول دیگری که در این فرم موجود نیست در حافظه لود شود و آن را به DataRow تبدیل کرد و به فرم دوم فرستاد چه باید کرد(پیشنهاد حرفه ای چیست؟)
راستی اگر امکان دارد این موضوع را بیشتر توضیح بفرمایید!
نقل قول:
البته اگر کارهالی دیتابیسی به لایه مخصوصی برای اینکار محول شود خیلی بهتر است ...
سلام
خوب شما میفرمائید دیگر برای این فرم ویرایشی جدید، DataRow ای ندارید که تحویلش دهید؟ درست است؟
یعنی محتویات DataGridView شما هم درهرصورت شامل این DataRow نیست
و اگر ویرایش در فرم دیاگوی دوم تمام شود، حتماً فرم اولتان هم جایی برای نمایش آن ندارد.
اصولاً مکانیزم های وابسته به DataSet همینطوری کند هستند و آن بحث DataRow فقط زمانی خوب و مقرون است که دیگر شما DataTable و DataSet ای را برای DataGridView لود کرده باشید.
یعنی مخصوص فقط همین ویرایش و درج نباشد (گمانم قبلاً هم گفته باشم)
یعنی دیگر DataSet در RAM است و خوب از آن و DataRow هایش استفاده میکنم !
ولی اگر DataSet ای در RAM نباشد و بخواهید مخصوص همین درج و ویرایش یک DataRow و طبیعتاً یک DataTable ایجاد کنید، این میشود نوعی چرخواندن لقمه دور سر !
به نظرم روشهای online ای مثل DataReader و Command برای این موارد بدون DataTable و DataRow آماده بهتر هستند.
(
تازه اگر برایتان سخت نمیشد، در همان DataGridView و ویرایش و درج عناصرش هم میتوانستید از DataReader و Command استفاده کنید و در نهایت فقط همان یک سطر را در DataGridView آپدیت کنید (کمترین Fill)
ولی کمی مشکل تر میشود و فعلاً شاید نیازتان نباشد.
)
==============
اگر خیلی روی DataRow تاکید دارید، میتوانید از دستورات زیر استفاده کنید:
طبیعتاً برای آپدیت دیتابیس هم باز باید با DataAdapter کار کنید.کد:System.Data.DataTable dt = new System.Data.DataTable();
using (System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM [tablename] WHERE [primarykey]=123;", "---CONNECTIONSTRING---"))
{
da.Fill(dt);
}
System.Data.DataRow dr;
if (dt.Rows.Count > 0) dr = dt.Rows[0];
===============
اگر فرمتان میخواهید کلی باشد و از هر جای برنامه قابل فراخوانی باشد ...
مشکلی ندارد که فرم دوم شما هم DataReader قبول کند و هم DataRow !
طبیعتاً در شرایط DataReader برای آپدیت نهایی باید از Command استفاده کنید.کد:public class Form2
: System.Windows.Forms
{
private System.Data.DataRow m_DataRow;
//private System.Data.IDataReader m_DataReader;
public Form2(System.Data.DataRow dr)
{
this.InitializeComponent();
this.m_DataRow = dr;
if (this.m_DataRow != null)
{
this.txtName1.Text = this.ConvertToString(this.m_DataRow[0]);
this.txtName2.Text = this.ConvertToString(this.m_DataRow[1]);
//...
}
}
public Form2(System.Data.IDataReader dr)
{
this.InitializeComponent();
//this.m_DataReader = dr;
if (dr != null)
{
this.txtName1.Text = this.ConvertToString(dr[0]);
this.txtName2.Text = this.ConvertToString(dr[1]);
//...
}
}
private string ConvertToString(object value)
{
if((value == null) || (value == System.DBNull.Value)) return string.Empty;
return value.ToString();
}
//...
سلام دوست عزیز
ببخشید چون من هیچگونه مرجع خاصی در دسترس ندارم و با DataReader, DataRow, ... زیاد کار نکرده ام برای همین طریقه کار با آنها را یاد ندارم به همین علت در فرمایشات شما به چند سئوال برخورد کردم
1.
چگونه می توان فیلد PrimaryKey آن را مقدار دهی کرد؟(معادل این دستور چیست؟)نقل قول:
using (System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM [tablename] WHERE [primarykey]=123;", "---CONNECTIONSTRING---"))
dbCom.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CuId", IdCu));
2.
منظور هماننقل قول:
طبیعتاً برای آپدیت دیتابیس هم باز باید با DataAdapter کار کنید.
StudentTableAdapter.Update(markazDBDataSet.Student );
است؟
3.
چگونه؟نقل قول:
طبیعتاً در شرایط DataReader برای آپدیت نهایی باید از Command استفاده کنید.
و در پایان اگر مرجع خاصی برای آشنایی با DataReader,... (فایل های Pdf آموزشی یا ...) به من معرفی کنید ممنون میشوم
با تشکر فراوان
سلام
برای یک dataadapter صفر کیلومتر، کدی مثل این:نقل قول:
چگونه می توان فیلد PrimaryKey آن را مقدار دهی کرد؟(معادل این دستور چیست؟)
منظور همان
StudentTableAdapter.Update(markazDBDataSet.Student );
و اگر dataadapter جدول مورد نظر را دارید و موجود است:کد:private void Test_Run()
{
using (System.Data.DataTable dt = new System.Data.DataTable())
{
using (System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM [tablename] WHERE ([primarykey]=@primarykey);", "---CONNECTIONSTRING---"))
{
da.SelectCommand.Parameters.Add("@primarykey", System.Data.SqlDbType.Int).Value = 123;
da.Fill(dt);
System.Data.DataRow dr;
if (dt.Rows.Count <= 0) return;
dr = dt.Rows[0];
using(Form2 f = new Form2(dr))
{
if (f.ShowDialog(this) != System.Windows.Forms.DialogResult.OK) return;
System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(da);
da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
da.UpdateCommand = cb.GetUpdateCommand();
da.Update(dt);
}
}
}
}
ولی این روشها به زور برای چندین سطر اطلاعات مناسب هستند و بازدهی خوبی دارند، چه رسد برای یک سطر دیتا !کد:private void Test_Run()
{
using (System.Data.DataTable dt = new System.Data.DataTable())
{
this.daname.SelectCommand.Parameters.Add("@primarykey", System.Data.SqlDbType.Int).Value = 123;
this.daname.Fill(dt);
System.Data.DataRow dr;
if (dt.Rows.Count <= 0) return;
dr = dt.Rows[0];
using (Form2 f = new Form2(dr))
{
if (f.ShowDialog(this) != System.Windows.Forms.DialogResult.OK) return;
this.daname.Update(dt);
}
}
}
مثل کشتن پشه با آر.پی.جی می ماند !
--------------
شما به راحتی میتو.انید یک شی Command با دستور UPDATE یا INSERT یا DELETE بسازید و با همان روش پارامتری، پارامترها را بدهید و با متد ExecuteNonQuery دستور را اجرا کنید.نقل قول:
چگونه؟
طبیعتاً لایه بندی صحیح میتواند کارتان را بسیار ساده و شفاف کند.
فقط به عنوان نمونه میتوانید مثال موجود در تاپیک زیر را دانلود کنید و ببینید چطور یک Dll مسئول ویرایش دیتابیس است و بقیه برنامه به راحتی و با چند خط کد از این dll استفاده میکنند.
forum.p30world.com/showthread.php?t=219657
به کد پروژه FDBM دقت کنید.
--------------
متاسفانه pdf فارسی آماده ندارم، شاید اگر جستجو کنید پیدا کنید.نقل قول:
در پایان اگر مرجع خاصی برای آشنایی با DataReader,... (فایل های Pdf آموزشی یا ...)
شما باید دنبال pdf و یا کتابهای ADO.Net باشید که اختصاصاً مربوط به کلاسهای فضای نام System.Data میشود.
(کتابش وجود دارد و میتوانید تهیه کنید، برای pdf هم اگر سرچ کنید، شاید پیدا شود.)
موفق باشید.
با سلام
طبق بحث دوستان اگر ما بخواهیم مورد جدید اضافه کنیم باید سطر جدید ایجاد کرده و به فرم دوم بفرستیم:
1) فرض کنید که موردی که خواستیم درج کنیم قبلا در بانک موجود بوده است و طبیعتا عمل آپدیت انجام می شود. و این عمل در فرم اول در سطر جدید اتفاق می افتد
2)هنگام درج منصرف شویم در این حالت هم یک سطر جدید به دیتا گرید اضافه شده است.
چی کار باید کرد که این اتفاق نیفتد؟
سلام
اول ببینیم شما درست منظورتان را رساندید و من درست متوجه شدم ...نقل قول:
هنگام درج منصرف شویم در این حالت هم یک سطر جدید به دیتا گرید اضافه شده است.
چی کار باید کرد که این اتفاق نیفتد؟
شما یک فرم گرایدی دارید (فرم اول) قرار است و یک فرم ویرایش فرمی و تک سطری دارید (فرم دوم) ...
هر سطر گراید با عملی (شبیه دبل کلیک) در فرم ددم باز و آماده ویرایش میشود ...
احتمالاً دکمه ای برای آیتم جدید در فرم اول دارید که با کلیک ان فرم دوم باز میشود و اطلاعات جدید را وارد میکند ...
حالا میخواهید بتوانید عملیات آیتم جدید در فرم دوم را لغو و کنسل کنید؟
درست متوجه شدم؟
=====
راه اول:
خوب چه نیازی است اول datarow جدید را به datatable اضافه کنید و بعد فرم دوم را باز کنید؟
datarow جدید را قبل از نمایش فرم دوم بسازید ولی َadd نکنید و به فرم دوم بفرستید ...
اگر فرم دوم با DialogResult.OK بسته شده بود آنگاه در ادامه دستورات بعد از showdialog سطر جدید را به datatable اضافه و add کنید.
راه دوم:
راه سوم:
با وجود راه اول گمانم نیازی به گفتن اینها نباشد! :31:
=====
موفق باشید.
سلام از توجه شما بینهایت سپاسگزارمنقل قول:
من این راه حلی که شما فرمودید پیدا کرده بودم ولی یادم رفته بود تاپیک رو ویرایش کنم:11:
ولی برای سوال اول راه حلی به ذهنم نرسیده !!!
سلام
لطفاً واضح تر بیان کنید.نقل قول:
ولی برای سوال اول راه حلی به ذهنم نرسیده !!!
من متوجه سوالی نشدم! بنظرم جمله بیشتر خبری بوده تا پرسشی!
با این که عمل آپدیت در بانک درست اتفاق می افتد ولی کاربر احساس می کند 2 تا سطر برای کاربر مذکور ایجاد شده است.نقل قول:
سلام
اگر مشکلتان را درست متوجه شده باشم (یا حتی نشده باشم!) شمکا میتوانید بعد از یک پایان یک Save موفقیت آمیز یک بارگذاری و Refresh دیتا ها را هم انجام دهید.نقل قول:
با این که عمل آپدیت در بانک درست اتفاق می افتد ولی کاربر احساس می کند 2 تا سطر برای کاربر مذکور ایجاد شده است.
اینکار مخصوصاً در برنامه های شبکه ای رایج است و بهانه ای است تا اطلاعات نمایشی روی فرم سینک و به روز شود و اخرین تغییرات و اضافه و کم شده و تغییر کرده های دیتابیس را (که شاید لحظاتی قبل توسط فرد دیگر در شبکه هم انجام شده باشد) روی فرم نشان دهد و فرم کاربر اخرین اطلاعات فعلی را نمایش دهد.
موفق باشید.
با تشکر فراوان از حسن توجه شما. من این کار را انجام دادم با دستور this.Refresh . ولی اتفاقی نمیفتد.نقل قول:
به امید موفقیت روزافزون شما
و یک سوال هم داشتم و اینکه Form1_Load(sender, e) با this.Refresh از نظر سرعت و عملکرد فرق دارن یا نه؟
سلام
Refresh دیتا نه ... !نقل قول:
من این کار را انجام دادم با دستور this.Refresh . ولی اتفاقی نمیفتد
یعنی دیتاستتان را Clear کنید و مجدد آن را Fill کنید ...
یکجایی در برنامه بالاخره می آیید و DataAdapter.Fill را انجام میدهید، درست است؟
همانجا (برای اطمینان) قبلش یک DataSet.Clear هم قرار دهید و این متد را برای باز تولید و باز خوانی اطلاعات مجدد فراخوانی کنید.
این دو کلاً از نظر عملکرد متفاوت هستند و ربطی به هم ندارند.نقل قول:
یک سوال هم داشتم و اینکه Form1_Load(sender, e) با this.Refresh از نظر سرعت و عملکرد فرق دارن یا نه؟
اولی رویدادی است که یکبار در زمان بارگذاری فرم اجرا میشود و دومی متدی است که نمایه دیداری و گرافیکی و layout فرم را باز تولید میکند.
شب بخیر.