PDA

View Full Version : همه چیز در مورد ارتباط فرم اول و دوم-انتقال فرم اول و دوم



sabz12
پنج شنبه 21 خرداد 1394, 19:00 عصر
با اجازه اساتید گفتم در مورد ارتباط دو فرم مطالب پراکنده ای هست اگر موافق باشید مطالب را یک جا جمع کنیم چیزی که من با سرچ ها و جستجو بدست اورم ممکن و حتما کامل نیست لطف کنید کمک کنید و اگر فیلم اموزشی در فقط در این مورد هست بزارید بلخره چند روش هست باید جمع اوری بشه تا ما بهترین را استفاده کنیم.
1- اگر اطلاعات رو از فرم یک میبری به فرم دو از کد زیر استفاده کن
var frm2 = new Frm2();
frm2.Controls["Label1"].Text = textBox1.Text;
frm2.ShowDialog();
:AR-SA'>اگر اطلاعات رو از فرم یک میبری به فرم دو از کد زیر استفاده کن
ببیند تا فرم باز نشده مقدار دهی نمیشه که شما بخوایید مقدار یک برچسب یا تکست رو تغییر بدید

2در فرم دوم یک متغییر استاتیک تعریف کرده و در فرم اول ان را مقداردهی می کنیم.
Public static string a;فرم دوم
در فرم اول
string a = ali;


3 روش کانستراکتور
در فرم دوم یک متغییر تعریف کرده
string a;
public nzim(string b)
{
string a=b;
InitializeComponent();
}

در فرم اول یک نمونه می سازیم که به اجبار ورودی می خواهد که شما متغییر(می خواهید بفرستید) را وارد می کنید

4 این روش هم که مورد تایید ولی من خودم متوجه نشدم چطوری و کجا استفاده کنم
(Application.OpenForms["Form2"].Controls["Textbox1"] as TextBox).Clear();

پیشا پیش از قرار دادن تجربیات و اموزشهای بی دریقدان کمال تشکر را دارم

RmeXXXXXXXXX
پنج شنبه 21 خرداد 1394, 21:52 عصر
فرم ها در اصل کلاس هستند. مشخصاً راهکارهای شی گرایی بهترین روش میتونن باشه. در روشهای فوق اصول شی گرایی به سادگی نقض شده است.
کلاسها باید اطلاعات را کپسوله کنند (برای دیگران مخفی) و درصورت نیاز کنترل شده در اختیار عموم قرار گیرند.

var frm2 = new Frm2();
frm2.Controls["Label1"].Text = textBox1.Text;

اگر سهواً یا عمدن یا بر حسب تغییر موقعیت اسم Label1 تغییر کند چه کسی باید این تغییر را در فرم یک (در همین سطر) هم اعمال کند؟ مسلما فراموش خواهد شد و باگ خواهد شد. درضمن آیا برنامه نویس دیگری هم خواهد توانست کد ما را درک کند وباهاش کار کند؟

Public static string a;
string a = ali;

کپسوله سازی چی شد؟ چ کسی و کجا موظف به بروز رسانی (مقدار دهی) متغیر هست؟ کیا نباید تغییر بدهند و کیا باید بدن؟ کیا میتونن مقدار رو بخونن؟ متغیر استاتیک ( مخصوصا عمومی هاش) عامل بروز خیلی از باگ ها هستند. اصلاً آیا نگهداشتن مقدار Text یک کنترل در یک متغیر دیگر تکرار کد نیست؟ اگه فرمی ایجاد بشه و مغییر هم بروز بشه و بعد بسته بشه آیا اطلاعات متغیر استاتیک بی هویت نمیشوند؟ (مقدار وجوددارد ولی مطعلق به جایی (شی ای) نیست)

public nzim(string b)
{
string a=b;
InitializeComponent();
}



آرگومان در سازنده کلاس یعنی این کلاس وابستگی دارد (در اینجا به string). آیا واقعاً اغلب چنین است؟ در برنامه نویسی مدرن وابستگی ها تزریق میشوند. آیا برای این مورد هم فکر کرده اید؟ مواظب وابستگی های کلاسی باشید

(Application.OpenForms["Form2"].Controls["Textbox1"] as TextBox).Clear();



بنظر شما این روش نیز میتونه صحیح باشه؟ - - - بدتر از مورد اول.

asman.abi
پنج شنبه 21 خرداد 1394, 22:20 عصر
فرم ها در اصل کلاس هستند. مشخصاً راهکارهای شی گرایی بهترین روش میتونن باشه. در روشهای فوق اصول شی گرایی به سادگی نقض شده است.
کلاسها باید اطلاعات را کپسوله کنند (برای دیگران مخفی) و درصورت نیاز کنترل شده در اختیار عموم قرار گیرند.

var frm2 = new Frm2();
frm2.Controls["Label1"].Text = textBox1.Text;

اگر سهواً یا عمدن یا بر حسب تغییر موقعیت اسم Label1 تغییر کند چه کسی باید این تغییر را در فرم یک (در همین سطر) هم اعمال کند؟ مسلما فراموش خواهد شد و باگ خواهد شد. درضمن آیا برنامه نویس دیگری هم خواهد توانست کد ما را درک کند وباهاش کار کند؟

Public static string a;
string a = ali;

کپسوله سازی چی شد؟ چ کسی و کجا موظف به بروز رسانی (مقدار دهی) متغیر هست؟ کیا نباید تغییر بدهند و کیا باید بدن؟ کیا میتونن مقدار رو بخونن؟ متغیر استاتیک ( مخصوصا عمومی هاش) عامل بروز خیلی از باگ ها هستند. اصلاً آیا نگهداشتن مقدار Text یک کنترل در یک متغیر دیگر تکرار کد نیست؟ اگه فرمی ایجاد بشه و مغییر هم بروز بشه و بعد بسته بشه آیا اطلاعات متغیر استاتیک بی هویت نمیشوند؟ (مقدار وجوددارد ولی مطعلق به جایی (شی ای) نیست)

public nzim(string b)
{
string a=b;
InitializeComponent();
}



آرگومان در سازنده کلاس یعنی این کلاس وابستگی دارد (در اینجا به string). آیا واقعاً اغلب چنین است؟ در برنامه نویسی مدرن وابستگی ها تزریق میشوند. آیا برای این مورد هم فکر کرده اید؟ مواظب وابستگی های کلاسی باشید

(Application.OpenForms["Form2"].Controls["Textbox1"] as TextBox).Clear();



بنظر شما این روش نیز میتونه صحیح باشه؟ - - - بدتر از مورد اول.

پس نتیجه می گیریم هیچ روش درستی نداریم! اینها هم غلطن!

پس چرا شما راه حل ندادید؟!

اصلا دلایل قوی و خوبی نبود.

RmeXXXXXXXXX
پنج شنبه 21 خرداد 1394, 22:30 عصر
میتونید یکی از روشهای بالا رو تصدیق کنید (با دلیل محکم)؟ - من هیچ یک از روشهای بالا رو به هیچ وجه انجام نخواهم داد ( منهای وابستگی در سازنده - اونم بشرط ایجاد انتزاع)

asman.abi
پنج شنبه 21 خرداد 1394, 22:32 عصر
یه روش اینه که اگه می خواهیم مثلا مقدار یه Lable در فرم دوم را از فرم اول بهش دسترسی داشته باشیم و تغییرش بدیم. اول: این که Lable رو از حالت private بهinternal تغییرش می دیم.(مورد internal محفوظ تر از public هست. مثلا اگر این فرم به صورت DLL در بیاد در مورد public کاربر می تونه مستقیما بهش دسترسی داشته باشه.خیلی به این کاری نداریم:افسرده:)
دوم: در فرم اول یه نمونه از فرم اول می سازیم و بعد به Lable مورد نظر می تونیم دسترسی پیدا می کنیم.

Form2 f = new Form2();
f.label1.Text = "change_text";

RmeXXXXXXXXX
پنج شنبه 21 خرداد 1394, 22:48 عصر
ایچنین بدون نمایش دادن فرم دوم هم میتوان به اطلاعات دسترسی داشت اطلاعاتی که هیچ چیز هستند.
میشه موقعیتش رو هم عوض کرد؟ f.Label1.Location=new Point(); میشه رنگشو هم عوض کرد! میشه... و خیلی میشه ی دیگه!
آیا راه حل درست رو انتخاب کردیم؟ فرض کنید نام کاربری رو از فرم دوم میخواهیم دریافت کنیم.txtUserName
این اطلاعات در فرم دوم توسط TextBox یا ComboBox یا... دریافت میشوند و کاری نداریم ما فقط نتیجه (نام کاربری) رو نیاز داریم و بس. پس به اشتراک گذاشتن txtUserName کار صحیحی نیست. درثانی این کنترل یک متغیر عضو کلاس است پس باید دسترسی محدود داشته باشه (private یا protocted)
در اینچنین موارد ایجاد یک Property یا متد ویژه توصیه میشود بدین نحو فقط اطلاعات مورد نیاز و بصورت کنترل شده در دسترس خواهند بود.

asman.abi
پنج شنبه 21 خرداد 1394, 23:08 عصر
ایچنین بدون نمایش دادن فرم دوم هم میتوان به اطلاعات دسترسی داشت اطلاعاتی که هیچ چیز هستند.
میشه موقعیتش رو هم عوض کرد؟ f.Label1.Location=new Point(); میشه رنگشو هم عوض کرد! میشه... و خیلی میشه ی دیگه!
آیا راه حل درست رو انتخاب کردیم؟ فرض کنید نام کاربری رو از فرم دوم میخواهیم دریافت کنیم.txtUserName
این اطلاعات در فرم دوم توسط TextBox یا ComboBox یا... دریافت میشوند و کاری نداریم ما فقط نتیجه (نام کاربری) رو نیاز داریم و بس. پس به اشتراک گذاشتن txtUserName کار صحیحی نیست. درثانی این کنترل یک متغیر عضو کلاس است پس باید دسترسی محدود داشته باشه (private یا protocted)
در اینچنین موارد ایجاد یک Property یا متد ویژه توصیه میشود بدین نحو فقط اطلاعات مورد نیاز و بصورت کنترل شده در دسترس خواهند بود.

اصلا این کار کردیم که مثلا خصوصیات lable رو تغییر بدیم وگرنه نیازی نبود.
اینجا ما تصمیم می گیریم چه کنیم با برنامه. شما چی می خوای؟
اگه به صورت private یکم بهتر protect دربیاد که اصلا نمیشه بهش دسترسی داشت. ولی برای این کار internal بهترین بود.

ما منتظر متد شما هستیم.

RmeXXXXXXXXX
پنج شنبه 21 خرداد 1394, 23:20 عصر
نه! اکیداً توصیه شده که حالت یک شی باید توسط خود شی تغییر کنه! یکی از اصول شی گرایی. برای تغییر حالت شی از بیرون هم باید اصول کپسوله سازی رو رعایت کنید. درخواست بدین به شی هدف تا خودش تغییر رو ایجاد کند.
فرم دوم رو ایجاد کردین که از طریق فرم دیگری حالتشو تغییر بدین؟ منظورم از حالت - وضعیت و مقدار متغیرهای عضو کلاس
به هیچ عنوان شما نیاز دسترسی به کنترل های فرم دوم ندارین! شما فقط حاصل ونتیجه رو میخواهید! نیازی نیست کنترلی که نام کاربری رو دریافت میکند رو در ببینید، فقط مقدار نام کاربری کفایت میکند. کنترل "کنترل دریافت نام کاربری" رو برای فرم دوم (والدش) محفوظ کنید (بخودش بسپارید) برای عمومی کردن مقدار یک متد یا خصوصیت عمومی تعریف کنید.

public class Form2{

public string UserName{
get{return this.txtUserName.Text;}
}
}

asman.abi
پنج شنبه 21 خرداد 1394, 23:37 عصر
به هیچ عنوان شما نیازی به دسترسی به کنترل های فرم دوم ندارین!
بعضی مواقع در برنامه پیش میاد. شرایط معلوم می کنه.


public class Form2{

public string UserName{
get{return this.txtUserName.Text;}
}
}




ممنون پاسختون
اینو یکم توضیح بدید. چه جوری بهش دسترسی پیدا می کنن مثلا برای تغییر نام lable یا هر کنترل دیگه ای.

sabz12
جمعه 22 خرداد 1394, 09:19 صبح
پس تا اینجا نتیجه گرفتیم که تا جایی که میشه کار درست این که
1 کپسوله سازی رعایت بشه
2 از پروپرتی استفاده کنیم

( منهای وابستگی در سازنده - اونم بشرط ایجاد انتزاع) .............منظورتون همون روش سومی بود؟؟

RmeXXXXXXXXX
جمعه 22 خرداد 1394, 19:08 عصر
بعضی مواقع در برنامه پیش میاد. شرایط معلوم می کنه.



ممنون پاسختون
اینو یکم توضیح بدید. چه جوری بهش دسترسی پیدا می کنن مثلا برای تغییر نام lable یا هر کنترل دیگه ای.

به هر فرم به عنوان یک واحد کاری نگاه کنید. مثلاً اگر فرمی قراره مشخصات یک کاربر رو دریافت کنه باید فقط همون کار رو انجام بده (+اصل تک مسئولیتی). به فرمهای دیگر ربطی نداره که نحوه ی کار این فرم چگونه است (یا رنگ و موقعیت فلان کنترل چیه؟). -- قالب کاری رو مشخص میکنیم (برای ایجاد هماهنگی در سراسر برنامه) ولی نحوه کار رو نه! --
پس هیچ نیازی وجود نداره که مثلاً از فرم یک مشخصات (نام و محل قرارگیری و رنگ پس زمینه و ....) کنترلی از فرم دوم رو تغییر بدیم. - رفتار درونی فرم دوم بخودش ربط داره (کپسوله سازی) تنها باید از فرم دوم اطلاعات رو بخواهیم و بس - به فرم یک هم ربطی نداره ک فلان اطلاعات رو با چه کنترلی دریافت میکنه - برنامه رو با سیم های زیاد بهم وابسته نکنید.
OpenFileDialog یک نمونه پیاده سازی خوب محسوب میشه.

using(var dlg= new OpenFileDialog()){
if(dlg.ShowDialog()== DialogResult.Ok)
{
string path=dlg.FileName;
}
}

در این کد ما FileName رو دریافت کردیم بدون اینکه بدونیم با چه کنترلی دریافت شده (رنگ چیه و...) فقط اطلاعات (آدرس) فایل انتخاب شده رو بدست آوردیم. آیا FileName جز یک Property هستش؟
سوال دیگه: اگر بخواهیم نوع فایلهای قابل انتخاب شدن رو فیلتر کنیم چه باید کرد؟ باید به ComboBox در فرم DialogBox فیلتر دسترسی داشته باشیم؟
مسلماً خیر. با دستور زیر از فرم میخواهیم که فیلتر رو انجام بده و بس:

dlg.Filter="*.jpg";

آیا Filter چیزی جز یک Property هستش؟

RmeXXXXXXXXX
جمعه 22 خرداد 1394, 19:35 عصر
تزریق وابستگی:
فرض میکنیم در فرم دوم نیاز به ثبت اطلاعات می باشد. از آنجایی که کار با پایگاه داده رو به یک ORM سپردیم مستقیماً نمیتوانیم داده ها رو ذخیره یا بازیابی کنیم و باید از ORM بخواهیم.
پس فرم ما وابسته است به ORM. (جهت دوستانی که آشنایی ندارن= ORM رو یک کلاس در نظر بگیرند که عملیات CRUID رو انجام میده CRUID= Create, Update, Insert, Delete)
هزینه ایجاد (new) زیاده و اکثراً نباید چنین کاری رو کرد ( برای جلوگیری از عدم پایداری برنامه و ایجاد واحد کاری Transactions)
می توان در سازنده کلاس، شی ORM وارد شود (تزریق شوند) گرچه میتوان از طریق پروپرتی هم اینکارو (ضعیف تر) انجام داد Setter Injection.
نتیجه: ارسال داده به کلاس (فرم دوم) از طریق سازنده کلاسی با رعایت نکات وابستگی یک راهکار مناسب می باشد.
برنامه نویسی مدرن نوشتن چند خط کد و عَلَم کردن یک برنامه نیست. باید اصولی برنامه نوشت -
سایت مهندس نصیری بهترین گزینه میتونه باشه: http://www.dotnettips.info

asman.abi
جمعه 22 خرداد 1394, 23:09 عصر
دوتا پست زدی ولی جواب ما رو ندادی؟ طریقه استفاده؟

و اما یه ایراد باید به مایکروسافت گرفت. اصلا چرا اجازه داده تو C# این جور کد زده بشه که شی گرایی رو دچار اختلال کنه به نظرم C# که زبون فقط شی گرایی هست این ضعفه!! البته اینو من بر اساس حرف شما گفتم. با حرف ما که قانع نشدید!

sabz12
شنبه 23 خرداد 1394, 19:17 عصر
این روش چطور در فرم دوم این را نوشتم تا بتونم به متد رفرش برسم.


public Form1 sdaFrm1 = null;
بعد از یک سری کد
sdaFrm1.reFresh()

sabz12
یک شنبه 24 خرداد 1394, 10:36 صبح
اساتيد محترم چون تازه كارم و نمي خواهم از اول راه اشتباه را برم كد را گذاشتم، لطفا بگيد راه درست چيه و بايد چكار كرد.قبلا هم از توجه شما تشكر مي كنمفرم اولم كه لود ميشه به نام Form1 هست كه داخلش يك متد رفرش نوشتم تا ديتا گريدويو را رفرش كنه و از sqlite استفاده كردم.فرم دوم به نام Tanzim كه داخلش چهارتا نكس باكس و يك باتن هست كه با كليك روي باتن اطلاعات وارد ديتا گريدويو و بانك شده و رفرش ميشه تا اطلاعات وارد شده قابل مشاهده باشه.خوب در فرم دوم اين كد را زدم داخل كلاسpublic Form1 sdaFrm1 = null;
اگر اين كد نباشد Refresh را در خط پايين نمي شناسه
اينم پايين تر در فرم دوم
public void btnSabt_Click(object sender, EventArgs e) {
if (textCod.Text != "" && textFarsi.Text != "")
{
string quryinsert = "insert into gadvalCod (cod,farsi,mesal,tozih)values(@cod,@fa,@mes,@toz)";


SQLiteCommand cmd = new SQLiteCommand(quryinsert, con);
cmd.Parameters.AddWithValue("@cod", textCod.Text);
cmd.Parameters.AddWithValue("@fa", textFarsi.Text);
cmd.Parameters.AddWithValue("@mes", textMesal.Text);
cmd.Parameters.AddWithValue("@toz", textTozeh.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
sdaFrm1.Refresh();
//sdaFrm1.reFresh();//صدا كردن فرم دوم
}


else
{
MessageBox.Show("دو قسمت اول خالي نباشد");
if (textCod.Text == "" && textFarsi.Text!="")
{


textCod.Focus();
}
if (textFarsi.Text=="" && textCod.Text!="") /// //فكوس به تكس باكس خالي
{
textFarsi.Focus();
}
if (textFarsi.Text == "" && textCod.Text == "")
{
textCod.Focus();
}
}
}
در فرم اول هم اين كد رفرشم هست
public void reFresh()//// رفرش رفرش {
string qurySelect = "Select id as'رديف',cod as'كد',farsi as'فارسي',mesal as'مثال',tozih'توضيح' from gadvalCod";// به جدول ورودي -دستورات سلكت
SQLiteCommand cmd = new SQLiteCommand(qurySelect, con);//دستور و كانكشن را بهش مي ديم
SQLiteDataAdapter objectAdapter = new SQLiteDataAdapter(cmd);//cmd خط فرمان هست
DataTable dt = new DataTable();///
objectAdapter.Fill(dt);
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].Visible = false;////////محو كردن ستون اول
////// /*/// dataGridView1.Rows[dataGridView1.RowCount - 1].Selected = true;////رفتن سطر اخر
if (dataGridView1.Rows.Count > 0)
{
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;////نمایش آخرین ورودی دیتاگرید
}
}
بازم تشكر

hamid_hr
یک شنبه 24 خرداد 1394, 12:17 عصر
این طوری بخواین کار کنین وقتی پروژه بزرگ بشه به مشکلات بزرگی میخورید
مثلا بخواین با فرمی مثل فرم 3 اطلاعاتو اپدیت کنین بعد این فرمو رفرش کنین چطوری میشه؟
البته اینم راه داره و میشه ولی از نظر ساختاری اشتباه است
برای این کار شما بهترین روش به نظر من sqldependency‌ هست
دربارش تحقیق کنید

sabz12
یک شنبه 24 خرداد 1394, 15:09 عصر
با تشكر
برنامه من كوچيك و تحت ويندوز هست
ولي دليل نميشه كه دنبال راه درست و منطقي نباشم
ايا راه ساده تر نيست يعني جایی كه tesqli استفاده شده نميشه پرورپرتی نوشت در این مورد ؟؟ من هدفم این که کار اصولی باشه شاید هزار تا سطر بیشتر وارد گریدویو نشه.خوب با این روش که کد زدم فکر کنم حافظه زیادی بگیره از برنامه درسته؟کار و راه درست چیه؟!!
با سپاس فراوان

hamid_hr
یک شنبه 24 خرداد 1394, 16:07 عصر
من پروژه شما رو نمیدونم
ولی فک کنین یه پروزه باشه که از هر جا داره بهش اطلاعات میاد
مثلا هواشناسی
بعد اینا باید یه نمودار انلاین داشته باشن
به نظر من باید بیان یه چیزی رو سرور دیتابیس داشته باشن که وقتی داده این جدول تغییر کرد یا اضافه شد به داده هاش یا کم شد به برنامه (کلاینت) اطلاع بده
این همون sqldependency هستش تو sqlserver

sabz12
یک شنبه 24 خرداد 1394, 16:25 عصر
حرف شما کاملا متین
ما که تازه از محیط کنسول وارد محیط گرافیکی شدیم فعلا قاطی می کنیم مطالب را به نظر شما از کانستراکتور می تونم کاری کنم که کارم اصولی بشه؟!
بعضی برنامه های حسابداری هم همین طور هست یعنی فرم دوم فرم اول رفرش میشه .یعنی از همین sqldepndency استفاده شده؟

hamid_hr
یک شنبه 24 خرداد 1394, 17:17 عصر
یعنی از همین sqldepndency استفاده شده؟
نه
باید ببینیم برنامه نویساش و تحلیل گرای نرم افزار چه کرده اند


نظر شما از کانستراکتور می تونم کاری کنم که کارم اصولی بشه؟!
بیاین یه ایونت تو program.cs به صورت public بزارین
و یه متد به نام refresh
تو این متد ایونت رو اجرا کنین
تو فرم آمارتون بیاین این ایونتو هندل کنین و اون کدای رفرشتونو بنویسین
حالا هر جای برنامه که بخواین میتونین با زدن program.refresh() اون فرم رو رفرش کنین

sabz12
یک شنبه 24 خرداد 1394, 18:40 عصر
ببخشید می تونم از همین رفرش استفاده کنم راستش باید برم بازم بررسی کنم چون بلدنیستم بازم تشکر که مسیر دادید چکار کنم

RmeXXXXXXXXX
یک شنبه 24 خرداد 1394, 19:45 عصر
نمونه برنامه گذاشتم جهت انتقال داده بین فرم ها.
امیدوارم راضی کننده باشه!

arsalan123
دوشنبه 20 اردیبهشت 1395, 19:59 عصر
سلام ! اول از همه یه عذر خواهی بخاطر ساختن تاپیک جدید
تو فروم سرچ زدم نمونه کدی که میخواستم رو نتونستم پیدا کنم :

میخوام اطلاعات تکست باکس فرم 2 رو منتقل کنم به دیتاگریدویو فرم 3
بطوری که با هر بار کلیک بر روی باتون در فرم 2 ، یک فیلد در دیتاگریدویو (فرم3) ساخته بشه و اطلاعات توی اون ریخته شه
منظورم اینه که هر بار که میفرستم اطلاعات رو ، تو یک سطر نمایش داده بشه
لطفا در صورت امکان کد بدید ! با آموزش و سورس چیزی نمیفهمم (مبتدی)

و از آخر میخوام دیتاگرید ویو رو توی دیتابیس ذخیره کنم (این رو بلدم)

ahmad.t1100
دوشنبه 20 اردیبهشت 1395, 20:42 عصر
سلام لینک زیر لینک دانلود پروژه قرار داده شده
http://forum.soitip.org/showpost.aspx?cod=21

arsalan123
دوشنبه 20 اردیبهشت 1395, 21:15 عصر
سلام لینک زیر لینک دانلود پروژه قرار داده شده
http://forum.soitip.org/showpost.aspx?cod=21

خیلی ممنون
و یه سوال دیگه

حالا میخوام
3 تا تکست ، توی یک سطر تو دیتاگریدویو اد بشه
یعنی کاربر "نام و نام خانوادگی و نام پدر" رو که زد ، تو یه سطر ادد بشن
و دوباره که زد ، زیر سطر بعدی اضافه شه (یعنی سطر جدید بسازه)

ممکنه کمک کنید ؟

ahmad.t1100
سه شنبه 21 اردیبهشت 1395, 08:12 صبح
سلام.مشاهده و دانلود کنید

http://forum.soitip.org/showpost.aspx?cod=22