PDA

View Full Version : سوال: مشکل در یک IF پیچیده



NasimBamdad
سه شنبه 06 تیر 1391, 15:10 عصر
سلام .

من 3 تا CheckBox دارم ، این CheckBox ها هر کدام نماد یک کالا هستند که این کالا ها هم در دیتابیس به طور جداگانه قیمت هایی دارند .

یک TextBox دارم که قیمت این کالا ها باید درش قرار بگیرند . یعنی اگه هر کدام از CheckBox ها تیک خوردند ، قیمتش از دیتابیس خونده بشه و به مقدار فعلی دیتابیس اضافه بشه .

لینـــک عکس (http://153.1.img98.net/out.php/i385916_p.gif)

عکس رو ببینید لطفا . حالا این IF و یا IF ها رو چه طوری در چه رویدادی بنویسم که استثناعات رو هم پیش بینی کنه ؟

ممنون میشم .

Arash_janusV3
سه شنبه 06 تیر 1391, 15:15 عصر
if (checkBox1.Checked)
{
// var = select
}
if (checkBox2.Checked)
{
// var += select
}
if (checkBox3.Checked)
{
// var += select
}

Y_Safaiee
سه شنبه 06 تیر 1391, 15:51 عصر
با سلام خدمت شما دوست گرامی

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

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



private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
sum();
}


private void sum()
{
long sum = 0;

foreach (var control in this.Controls)
{
if (control is CheckBox)
{
CheckBox chk = (CheckBox)control;
if (chk.Checked== true) sum += long.Parse(chk.Text);
}


label1.Text = sum.ToString();


}

}


راستی میتونی به جای اینکه 3بار Sum رو بنویسی چک باکسهای مورد نظرتو رو انتخاب بعد بری تو رویدادها و روی رویداد CheckedChanged دابل کلیک کنی بخش کد میاد و کدتو اونجا بنویسی خوبیش اینه که هرکدوم از چک باکسها عوض شه این رویداد صدا زده میشه

نکته آخر اگه میخوای فقط چک باکسهای جایه خاصی(مثلا تو عکس شما GroupBox شرط بخوره اینطوری بنویس



long sum = 0;

foreach (var control in groupBox1.Controls)
{
if (control is CheckBox)
{
CheckBox chk = (CheckBox)control;
if (chk.Checked== true) sum += long.Parse(chk.Text);
}
label1.Text = sum.ToString();
}


موفق باشی
بایت بایت

NasimBamdad
سه شنبه 06 تیر 1391, 16:05 عصر
با سلام خدمت شما دوست گرامی

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

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



private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
sum();
}


private void sum()
{
long sum = 0;

foreach (var control in this.Controls)
{
if (control is CheckBox)
{
CheckBox chk = (CheckBox)control;
if (chk.Checked== true) sum += long.Parse(chk.Text);
}


label1.Text = sum.ToString();


}

}


راستی میتونی به جای اینکه 3بار Sum رو بنویسی چک باکسهای مورد نظرتو رو انتخاب بعد بری تو رویدادها و روی رویداد CheckedChanged دابل کلیک کنی بخش کد میاد و کدتو اونجا بنویسی خوبیش اینه که هرکدوم از چک باکسها عوض شه این رویداد صدا زده میشه

نکته آخر اگه میخوای فقط چک باکسهای جایه خاصی(مثلا تو عکس شما GroupBox شرط بخوره اینطوری بنویس



long sum = 0;

foreach (var control in groupBox1.Controls)
{
if (control is CheckBox)
{
CheckBox chk = (CheckBox)control;
if (chk.Checked== true) sum += long.Parse(chk.Text);
}
label1.Text = sum.ToString();
}


موفق باشی
بایت بایت


مرسی دوست عزیز ، ممنون که وقت گذاشتید . شب تست می کنم اگه اشکالی بود مجدد مزاحم میشم . واقعا مرسی

NasimBamdad
سه شنبه 13 تیر 1391, 11:22 صبح
سلام . من با این کد کار کردم ، اما زیاد ازش سر در نیاوردم . یعنی اینکه مشکلم این هست که هر چک باکس یک مراحل برای خواند قیمت دارند

مثلا این طوری


SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT * FROM test_types WHERE id = '3'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
long sum = Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();


با اون کوری میام قیمت هر کالا رو می خوانم . چه طوری این رو هندل کنم ؟ برای بقیه کالا ها چه طوری بگم اگه چک خورده بود این قیمتش میشه ؟

NasimBamdad
سه شنبه 13 تیر 1391, 11:29 صبح
در کل کد من با Merg کردن کد های دوستان این طوری شد


private void sum()
{
Int64 a = 0;
if (CheckBox1.Checked)
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT * FROM test_types WHERE id = '1'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
a = Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();
}
if (CheckBox2.Checked)
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT * FROM test_types WHERE id = '2'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
a += Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();
}
if (CheckBox3.Checked)
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT * FROM test_types WHERE id = '3'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
a += Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();
}
if (CheckBox4.Checked)
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT * FROM test_types WHERE id = '4'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
a += Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();
}

textBox3.Text = a.ToString();

}

//////////


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
sum();
}

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
sum();
}







ولی Youuness (http://barnamenevis.org/member.php?78417-Youuness) عزیز ، لطف کنید با روش خودتان هم به من آموزش بدید ، از روش شما خیلی خوشم اومده . اما بهش وارد نیستم . بگید چه طوری از کد شما برای کارم استفاده کنم

با تشکر و فراوان

Arash_janusV3
سه شنبه 13 تیر 1391, 14:19 عصر
private void sum() {
long sum = 0;
foreach (var control in this.Controls)
{
if (control is CheckBox)
{
CheckBox chk = (CheckBox)control;
if (chk.Checked== true) sum += long.Parse(chk.Text);
}
label1.Text = sum.ToString();
}
}


این یک حلقه هستش که تمام کنترل هایی که روی فرمتون هستش رو بررسی میکنه
حالا درون اون یک شرط هست که اگر کنترلی از نوع cheزckbox باشه به داخله دستور وارد می شود
و سپس شرط دیگری هست که آیا این کنترل تیک شده هست یا نه در صورت true وارد دستور و مقداری که می خواهید به دست بیاورید را محاسبه می کنه

اشکال این دستور اینه که همه کنترلها در حلقه بررسی می شوند و همه checkbox ها مقدار دهی شان بررسی می شه

Arash_janusV3
سه شنبه 13 تیر 1391, 14:27 عصر
دستورات را می توانید به صورت زیر خلاصه کنید

private void sum()
{
if(number != 0)
{
Int64 a = 0;
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();

cmd.CommandText = "SELECT * FROM test_types WHERE id = '" + number + "'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
a = Convert.ToInt64(ds.Tables[0].Rows[0]["cost"].ToString());
cnn.Close();

textBox3.Text = a.ToString();
}

}
private int number=0;

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
number = 1;
sum();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
number = 2;

sum();
}

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
number = 3;

sum();
}