PDA

View Full Version : مبتدی: چطور میشه تا زمانی که کلیه اطلاعات در فرم وارد نشده دکمه next فعال نشه ؟



rospina_63
یک شنبه 28 اردیبهشت 1393, 00:34 صبح
با عرض سلام خدمت مهندسان عزیز و زحمت کش.
خواستم بپرسم چطوری میتونیم تا زمانی که کلیه اطلاعات در فرم وارد نشده دکمه next فعال نشه؟

ممنون میشم منو راهنمایی کنید.

aghayex
یک شنبه 28 اردیبهشت 1393, 07:53 صبح
اگه من باشم این کار رو انجام نمی دم اما برای این کار شما در رویداد تکست چنج باید تمام مقادیر تکس باکس هات رو چک کنی و اگه همه خالی بودن متد Enable دکمت رو فالس و در غیر این صورت ترو کنی

Davidd
یک شنبه 28 اردیبهشت 1393, 08:00 صبح
سلام
اگه منظور از اطلاعات، TextBox هستند، يه راهش اينه كه رخداد TextChange تمام TextBoxهارو به يه متد وصل كني. براي اين كار تمام TextBoxهارو انتخاب كن و از قسمت eventها رخداد TextChange انتخاب كن. تو اين متد چك ميكني اگه تمام فيلدها پر بودند باتن فعال بشه. براي انكار لازم نيست نام تمام TextBoxهارو بنويسي، كالكشن Controls ليست تمام كنترل هاي روي فرم داره و ميتوني از foreach روي Controls براي پيدا كردن TextBox ها و چك كردن متن آنها استفاده كني. اگه توي كدش مشكل داري راهنمايي كنم.

rospina_63
یک شنبه 28 اردیبهشت 1393, 10:23 صبح
از دوستان مهندس ممنونم. حقیقتا خیلی حرفه ای توضیح دادید.اگه امکان داره که کد یه مدل کوچک شده برنامه رو بذارید ممنون میشم.مثلا دوتاپنجره تعریف کنید و دوتا تکس باکس هم بذارید و یه دکمه next.
با کمال سپاس و تشکر.

rospina_63
یک شنبه 28 اردیبهشت 1393, 10:24 صبح
اگه من باشم این کار رو انجام نمی دم اما برای این کار شما در رویداد تکست چنج باید تمام مقادیر تکس باکس هات رو چک کنی و اگه همه خالی بودن متد Enable دکمت رو فالس و در غیر این صورت ترو کنی

مهندس چرا شما همچین کاری رو نمیکردید؟ عیب این کار کجاست؟و اینکه چه راهی رو پیشنهاد می کنید؟

aghayex
یک شنبه 28 اردیبهشت 1393, 13:09 عصر
این کار کلاس کار رو بالا می بره اما توجه داشته باش من 10 الی 20 تا تکس باکس دارم که در اون متد باید پر بودنش رو چک کنم حالا کاربر هر موقع نوشته رو تغییر بده باید تمام اینها اجرا بشه . به نظر من نیاز نیس اما برای بیشتر دوستان نیاز هست و فرم رو شکیل می کنه .
خوب این هم یه نظره

rospina_63
دوشنبه 29 اردیبهشت 1393, 09:33 صبح
این کار کلاس کار رو بالا می بره اما توجه داشته باش من 10 الی 20 تا تکس باکس دارم که در اون متد باید پر بودنش رو چک کنم حالا کاربر هر موقع نوشته رو تغییر بده باید تمام اینها اجرا بشه . به نظر من نیاز نیس اما برای بیشتر دوستان نیاز هست و فرم رو شکیل می کنه .
خوب این هم یه نظره

آها که این طور . اوکی.ممنون مهندس.

rospina_63
دوشنبه 29 اردیبهشت 1393, 09:35 صبح
سلام
اگه منظور از اطلاعات، TextBox هستند، يه راهش اينه كه رخداد TextChange تمام TextBoxهارو به يه متد وصل كني. براي اين كار تمام TextBoxهارو انتخاب كن و از قسمت eventها رخداد TextChange انتخاب كن. تو اين متد چك ميكني اگه تمام فيلدها پر بودند باتن فعال بشه. براي انكار لازم نيست نام تمام TextBoxهارو بنويسي، كالكشن Controls ليست تمام كنترل هاي روي فرم داره و ميتوني از foreach روي Controls براي پيدا كردن TextBox ها و چك كردن متن آنها استفاده كني. اگه توي كدش مشكل داري راهنمايي كنم.

مهندس ظاهرا دوست ندارید منو راهنمایی کنید؟!!!
خوش به حال خودتون که بلدید و این چیزا اینقدر براتون پیش پا افتاده هست که دیگه حوصلتون نمیشه جواب بدید.اوکی مرسی.

Davidd
دوشنبه 29 اردیبهشت 1393, 10:27 صبح
مهندس ظاهرا دوست ندارید منو راهنمایی کنید؟!!!
خوش به حال خودتون که بلدید و این چیزا اینقدر براتون پیش پا افتاده هست که دیگه حوصلتون نمیشه جواب بدید.اوکی مرسی.
دوست عزيز راه بهتر و ساده تر اينه كه وقتي كاربر روي دكمه كليك كرد تمام فيلدهارو چك كني و اگه خالي بودن يه پيغام به كاربر نشون بدي.
حالا اگه اصرار داري دكمه غيرفعال باشه event TextChange تمام TextBox ها رو به اين متد وصل كن (با همون روشي كه گفتم)

private void textBox1_TextChanged(object sender, EventArgs e)
{
foreach (var cntr in this.Controls)//control haye rooye form
{
if (cntr is TextBox )
{
if ((cntr as TextBox).Text.Trim() == "") //agar control TextBox ast va Text an khaali ast
return;//agar yek TextBox khali bood Return anjam mishavad
}
}

Button1.Enabled = true;
}
پ.ن : this به فرم جاري اشاره مي كند و Button1 همون دكمه مفروض است.

Hamishebahar
دوشنبه 29 اردیبهشت 1393, 13:46 عصر
بسم الله الرحمن الرحیم.
سلام.
بهترین روشی که من بهتون پیشنهاد میکنم اینه که از DataBinding استفاده کنید این عمل علاوه بر کارایی بهتر خوانایی برنامه شما رو هم بهتر میکنه:
توی فرمتون یه دکمه و دو کادر متن اضافه کنید:
public partial class Form1 : Form, INotifyPropertyChanged
{
public Form1()
{
InitializeComponent();
this.DataBindings.Add(new Binding("TextName", textBox1, "Text"));
this.DataBindings.Add(new Binding("TextAddress", textBox2, "Text"));
button1.DataBindings.Add(new Binding("Enabled", this, "CanExecuteCommand"));
}
private string _TextName;
public string TextName
{
get { return _TextName; }
set { _TextName = value; OnPropertyChanged("CanExecuteCommand"); }
}

string _TextAddress;

public string TextAddress
{
get { return _TextAddress; }
set { _TextAddress = value; OnPropertyChanged("CanExecuteCommand"); }
}

public bool CanExecuteCommand
{
get { return !(String.IsNullOrEmpty(TextName) || String.IsNullOrEmpty(TextAddress)); }
}

public void OnPropertyChanged(string valueName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(valueName));
}

public event PropertyChangedEventHandler PropertyChanged;
}

موفق باشید.

rospina_63
سه شنبه 30 اردیبهشت 1393, 09:46 صبح
دوست عزيز راه بهتر و ساده تر اينه كه وقتي كاربر روي دكمه كليك كرد تمام فيلدهارو چك كني و اگه خالي بودن يه پيغام به كاربر نشون بدي.
حالا اگه اصرار داري دكمه غيرفعال باشه event TextChange تمام TextBox ها رو به اين متد وصل كن (با همون روشي كه گفتم)

private void textBox1_TextChanged(object sender, EventArgs e)
{
foreach (var cntr in this.Controls)//control haye rooye form
{
if (cntr is TextBox )
{
if ((cntr as TextBox).Text.Trim() == "") //agar control TextBox ast va Text an khaali ast
return;//agar yek TextBox khali bood Return anjam mishavad
}
}

Button1.Enabled = true;
}
پ.ن : this به فرم جاري اشاره مي كند و Button1 همون دكمه مفروض است.

مهندس عزیز من راهی رو که فرمودید رفتم متاسفانه نتونستم عملیش کنم. ظاهرا یه ذره برا من سخته.

میشه خواهش کنم اون راهی رو که خودتون مد نظرتونه (راه بهتر و ساده تر اينه كه وقتي كاربر روي دكمه كليك كرد تمام فيلدهارو چك كني و اگه خالي بودن يه پيغام به كاربر نشون بدي) توضیح بدهید؟
نمیدونم کدش رو چطوری بنویسم که این کار رو انجام بدم.
با کمال تشکر و سپاس فراوان

rospina_63
سه شنبه 30 اردیبهشت 1393, 09:54 صبح
بسم الله الرحمن الرحیم.
سلام.
بهترین روشی که من بهتون پیشنهاد میکنم اینه که از DataBinding استفاده کنید این عمل علاوه بر کارایی بهتر خوانایی برنامه شما رو هم بهتر میکنه:
توی فرمتون یه دکمه و دو کادر متن اضافه کنید:
[CSHARP]public partial class Form1 : Form, INotifyPropertyChanged
{
public Form1()
{

موفق باشید.

با عرض سلام خدمت شما مهندس عزیز.
خواستم از شما تشکر کنم که به سوال من پاسخ دادید و اینکه راهی رو که فرمودید رفتم و جواب داد ولی یه مشکل دیگه که دارم اینه که نمیدونم برا تکس باکسهای بیشتر از 2تا چطوری بسطش بدم. من کد رو براتون میذارم ببینید مشکل کارم کجاست. ممنونم.

public
partialclassForm1 : Form, INotifyPropertyChanged
{
public Form1()

{
InitializeComponent();
this.DataBindings.Add(newBinding("TextName", textBox1, "Text"));
this.DataBindings.Add(newBinding("TextAddress", textBox2, "Text"));
this.DataBindings.Add(newBinding("TextAddress", textBox3, "Text"));

button1.DataBindings.Add(
newBinding("Enabled", this, "CanExecuteCommand"));
}
publicDouble a, b, c, d;
privatestring _TextName;
publicstring TextName

{
get { return _TextName; }
set { _TextName = value; OnPropertyChanged("CanExecuteCommand"); }

}
string _TextAddress;

publicstring TextAddress

{

get { return _TextAddress; }

set { _TextAddress = value; OnPropertyChanged("CanExecuteCommand"); }

}

publicbool CanExecuteCommand

{
get { return !(String.IsNullOrEmpty(TextName) || String.IsNullOrEmpty(TextAddress)); }

}
publicvoid OnPropertyChanged(string valueName)

{
if (PropertyChanged != null)

PropertyChanged(this, newPropertyChangedEventArgs(valueName));

}

publiceventPropertyChangedEventHandler PropertyChanged;

privatevoid button1_Click(object sender, EventArgs e)

{

panel1.Visible = true;

a=Double.Parse(textBox1.Text);

b=Double.Parse(textBox2.Text);

c = Double.Parse(textBox3.Text);

d=(a+b)*c;

textBox4.Text = d.ToString();

}

gjmkdyttyhujk
سه شنبه 30 اردیبهشت 1393, 15:30 عصر
یه روش دیگه هم که میتونید استفاده کنید این هست که اگه کاربر تمام فیلد ها رو پر نکرد یه پیام خطایی به کاربر نشون داده بشه. در غیر اینصورت یعنی تکمیل کامل فیلدها کاربر بتونه به قسمت بعدی بره.

کدش هم خیلی ساده است

در رخداد کلیک باتنتون این کدها رو بنویسید.



if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "" && textBox4.Text != "")
{
//رفتن به صفحه بعدی
}
else
{
messagebox.show("کاربر گرامی لطفا فیلدهای مربوطه را کامل نمایید سپس بر روی ثبت اطلاعات کلیک نمایید");
}

برای هرچندتا تکست باکس هم می تونید استفاده کنید.

rospina_63
سه شنبه 30 اردیبهشت 1393, 18:16 عصر
از مهندسای گلم تشکر میکنم.دستتون درد نکنه. تونستم درستش کنم. سایت فوق العاده ای دارید.
من تو این سایت 3 تا پست گذاشتم و 2تاشو تو کمتر از نصف روز به سوالم جواب داده شد. و این عالیه.
امیدوارم خدا همیشه شما رو تو تمام مراحل زندگیتون موفق کنه.
سایت خیلی خوبی داریم. واقعا از همتون و به ویژه باعث و بانی این سایت تشکر میکنم. خدا خیرتون بده.