PDA

View Full Version : سوال: استفاده از چکد لیست باکس در سی شارپ



feryt20
سه شنبه 14 مرداد 1393, 11:57 صبح
سلام دوستان
من یه سری اطلاعات داخل یک جدول دو ستونه شامل نام و شماره توی بانک دارم
چکد لیست باکس رو با نام های موجود در جدول پر کردم
حالا میخام هر کدومو که انتخاب میکنم شماره مربوط به اون نام رو برگردونه(مثلا داخل تکست باکس)
مثلا اگه نام های یکو هفتو هجده انتخاب شده شماره به این صورت برگشت داده بشه: *1*7*18*

برعکس این کارو هم لازم دارم
مثلا داخل تکست باکس این اعدادو *1*7*18* وارد کنم و چکد لیست باکس روی نام های مربوط تیک بزنه

ممنون میشم کمک کنید

--------

قصدم اینه اطلاعاتو بفرستم به دیتابیس و یا درصورت لزوم آپدیت کنم
مثلا الان کاربر گزینه های یکو دو سه رو انتخاب میکنه من رشته *1*2*3* رو داخل دیتابیس ذخیره میکنم
حالا کاربر میخاد اونو آپدیت کنه
من رشته *1*2*3* رو از دیتابیس میگیرم روی چک لیست باکس نمایش میدم
حالا کاربر گزینه 1 رو حذف میکنه گزینه 5 رو انتخاب میکنه
حالا من باید رشته *2*3*5* رو به دیتابیس بفرستم و آپدیت کنم
پس به هردو کار باهم احتیاج دارم
دقیقا من فقط اون رشته MyString رو لازم دارم

s.karim
سه شنبه 14 مرداد 1393, 12:06 عصر
private void MyChl_ItemCheck(object sender, ItemCheckEventArgs e)
{
string MyString = String.Empty;

if (e.NewValue == CheckState.Checked)
{
MyString = MyString + MyChl.SelectedValue + "*";
}


else if (e.NewValue == CheckState.Unchecked)
{
MyString = MyString.Replace(MyChl.SelectedValue + "*", "");
}
}

feryt20
سه شنبه 14 مرداد 1393, 12:22 عصر
private void MyChl_ItemCheck(object sender, ItemCheckEventArgs e)
{
string MyString = String.Empty;

if (e.NewValue == CheckState.Checked)
{
MyString = MyString + MyChl.SelectedValue + "*";
}


else if (e.NewValue == CheckState.Unchecked)
{
MyString = MyString.Replace(MyChl.SelectedValue + "*", "");
}
}



دوست عزیز این روش شما هیچی جز یک * برنمیگردونه
من میخام شماره ی مربوط به نام همراه با * بهم بده
بازم ممنون

فرض کنید یک چکد لیست باکس دارید داخلش 20 تا ایتم وارد کنید
یک تکست باکس
حالا میخام مثلا وقتی ایتم های اولو بیستم رو انتخاب میکنم داخل تکست باکس بنویسه *1*20*

و برعکس وقتی داخل تکست باکس مینویسم *1*20* ایتم های اولو بیستم چکد بشه

feryt20
سه شنبه 14 مرداد 1393, 20:25 عصر
دوستان یکی نیست جواب بده ؟
من خودم تقریبا قسمت اول سوالمو به جواب رسیدم
حالا قسمت دومشو میخام تکمیل کنم
وقتی داخل تکست باکس مینویسم *1*20* ایتم های اولو بیستم تیک زده بشه

s.karim
چهارشنبه 15 مرداد 1393, 08:40 صبح
این برای قسمت دوم:





private void button1_Click(object sender, EventArgs e)
{
string[] s = textBox1.Text.Split('*');

foreach (var item in s)
{
if (!string.IsNullOrEmpty(item))
{
MyChl.SetItemChecked(int.Parse(item), true);
}
}
}

s.karim
چهارشنبه 15 مرداد 1393, 08:44 صبح
اینم برای قسمت اول:

private void MyChl_ItemCheck(object sender, ItemCheckEventArgs e)
{
string MyString = String.Empty;

if (e.NewValue == CheckState.Checked)
{
MyString = MyString + MyChl.SelectedIndex + "*";
}


else if (e.NewValue == CheckState.Unchecked)
{
MyString = MyString.Replace(MyChl.SelectedIndex + "*", "");
}

textBox1.Text += MyString;
}

kahe.mehrdad
چهارشنبه 15 مرداد 1393, 08:50 صبح
شما برای قسمت دوم باید رشته را split کنید، تنها راهش همینه. فقط باید داخل try catch بذاریدش که اگه کاربر اعداد نامعقول داد CheckboxListشما ارور out of range نده بهتون.
قسمت اول هم اگه مشکل داشتید لطفا کد را بفرستید.

feryt20
چهارشنبه 15 مرداد 1393, 15:37 عصر
من این کدو با کمک دوستم نوشتم
قسمت اولش به خوبی کار میکنه
قسمت دومشم کار میکنه ولی وقتی توی تکست باکس دوم مثلا مینویسم *1*2*3* توی تکست باکس اول مینویسه *1-*1-*1-*
چون میخام هرسری موارد انتخاب شده رو آپدیت کنمو دوباره به بانک بفرستم این مشکل اذیتم میکنه
string MyString = string.Empty;
private void lcb_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
{
if (MyString == string.Empty)
MyString = "*";
MyString = MyString + lcb.SelectedIndex + "*";
textBox1.Text = MyString;
}
else if (e.NewValue == CheckState.Unchecked)
{
MyString = MyString.Replace(lcb.SelectedIndex + "*", "");
if (MyString == "*")
{
MyString = string.Empty;
}
textBox1.Text = MyString;
}
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
string tmp = textBox2.Text;
//
// MyString = tmp;
//
if (tmp == "*")
return;

if (tmp == string.Empty)
{
for (int index = 0; index < lcb.Items.Count; index++)
lcb.SetItemChecked(index, false);
return;
}


if (tmp[0] != '*' || tmp[tmp.Length - 1] != '*' || tmp == "")
return;
tmp = tmp.Remove(0, 1);
tmp = tmp.Remove((tmp.Length - 1), 1);
string[] sepratedDate = tmp.Split('*');

for (int index = 0; index < lcb.Items.Count; index++)
lcb.SetItemChecked(index, false);

foreach (string s in sepratedDate)
{
int index = Int32.Parse(s);
lcb.SetItemChecked(index, true);
}
}

kahe.mehrdad
پنج شنبه 16 مرداد 1393, 08:59 صبح
من این کدو با کمک دوستم نوشتم
قسمت اولش به خوبی کار میکنه
قسمت دومشم کار میکنه ولی وقتی توی تکست باکس دوم مثلا مینویسم *1*2*3* توی تکست باکس اول مینویسه *1-*1-*1-*
چون میخام هرسری موارد انتخاب شده رو آپدیت کنمو دوباره به بانک بفرستم این مشکل اذیتم میکنه
string MyString = string.Empty;
private void lcb_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
{
if (MyString == string.Empty)
MyString = "*";
MyString = MyString + lcb.SelectedIndex + "*";
textBox1.Text = MyString;
}
else if (e.NewValue == CheckState.Unchecked)
{
MyString = MyString.Replace(lcb.SelectedIndex + "*", "");
if (MyString == "*")
{
MyString = string.Empty;
}
textBox1.Text = MyString;
}
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
string tmp = textBox2.Text;
//
// MyString = tmp;
//
if (tmp == "*")
return;

if (tmp == string.Empty)
{
for (int index = 0; index < lcb.Items.Count; index++)
lcb.SetItemChecked(index, false);
return;
}


if (tmp[0] != '*' || tmp[tmp.Length - 1] != '*' || tmp == "")
return;
tmp = tmp.Remove(0, 1);
tmp = tmp.Remove((tmp.Length - 1), 1);
string[] sepratedDate = tmp.Split('*');

for (int index = 0; index < lcb.Items.Count; index++)
lcb.SetItemChecked(index, false);

foreach (string s in sepratedDate)
{
int index = Int32.Parse(s);
lcb.SetItemChecked(index, true);
}
}


دوست من شما چرا رویداد رو روی textBox2 تعریف کردید؟ دوستمون s.karim درست گفتند باید یک کلید تعریف کنید و روی اون تمام مراحل split و insert به دیتابیس را انجام بدید. دوم اینکه لازم نیست اینقدر رشته را دستی پیمایش کنید و دنبال * بگردید. توی اینجا (http://msdn.microsoft.com/en-us/library/ms228388.aspx) ببینید چه شکلی رشته را شکونده.
به نظر من کد s.karim درسته اجراش کنید ببینید اگر مشکلی داشت مطرحش کنید.

feryt20
پنج شنبه 16 مرداد 1393, 09:32 صبح
دوست من شما چرا رویداد رو روی textBox2 تعریف کردید؟ دوستمون s.karim درست گفتند باید یک کلید تعریف کنید و روی اون تمام مراحل split و insert به دیتابیس را انجام بدید. دوم اینکه لازم نیست اینقدر رشته را دستی پیمایش کنید و دنبال * بگردید. توی اینجا (http://msdn.microsoft.com/en-us/library/ms228388.aspx) ببینید چه شکلی رشته را شکونده.
به نظر من کد s.karim درسته اجراش کنید ببینید اگر مشکلی داشت مطرحش کنید.

مشکل کد ایشون هم همینه که عرض کردم
قسمت اولش مشکلی نداره
قسمت دومش وقتی کد *1*2*3* یا هرچی مثل این رو که بزنید وقتی روی کلید کلیک میکنید مینویسه *1*2*3*1-*1-*1-*
شما لطف کنید یکبار کد ایشون یا بنده رو اجرا کنید متوجه منظورم میشید

feryt20
پنج شنبه 16 مرداد 1393, 09:42 صبح
راستی بابت سوال اولتون هم من تکست باکس هارو فقط جهت نمایش گذاشتم
وگرنه من فقط با اون رشته MyString کار دارم

kahe.mehrdad
پنج شنبه 16 مرداد 1393, 09:54 صبح
مشکل کد ایشون هم همینه که عرض کردم
قسمت اولش مشکلی نداره
قسمت دومش وقتی کد *1*2*3* یا هرچی مثل این رو که بزنید وقتی روی کلید کلیک میکنید مینویسه *1*2*3*1-*1-*1-*
شما لطف کنید یکبار کد ایشون یا بنده رو اجرا کنید متوجه منظورم میشید
چشم. من این کار را انجام میدم. شما بی زحمت آخر foreach کد s.karim یک BreakPoint بگذارید ببینید مقادیر را آیا درست split میکنه. اگر درست مقادیر داره split میشه ایراد از بعدشه. اینو الالحساب چک کنید ببینید چی میشه:


private void button1_Click(object sender, EventArgs e)
{
string[] s = textBox1.Text.Split('*');
var str = new StringBuilder();
foreach (var item in s)
{
if (!string.IsNullOrEmpty(item))
{
str.Append(int.Parse(item) + "*");
}
TextBox2.Text = str.ToString();
}
}

feryt20
پنج شنبه 16 مرداد 1393, 10:08 صبح
آره تمام مقادیرو درست split میکنه!!
من نمیدونم این 1- هارو از کجا میاره!!!!

feryt20
پنج شنبه 16 مرداد 1393, 11:22 صبح
فهمیدم 1- رو از کجا میاره
وقتی اعدادو وارد میکنم و روی button کلید میکنم وقتی گزینه ها چکد میشه سلکتد ایندکسشون 1- میشه
لطفا برای رفع این مشکل راهنماییم کنید

kahe.mehrdad
پنج شنبه 16 مرداد 1393, 13:57 عصر
فهمیدم 1- رو از کجا میاره
وقتی اعدادو وارد میکنم و روی button کلید میکنم وقتی گزینه ها چکد میشه سلکتد ایندکسشون 1- میشه
لطفا برای رفع این مشکل راهنماییم کنید
دوست من این برنامه رو اجرا کن

feryt20
پنج شنبه 16 مرداد 1393, 14:33 عصر
دوست من این برنامه رو اجرا کن

فکر کنم متوجه منظورم نشدید
من میخام هر دو کارو باهم انجام بدم
وگرنه اون کدای بالا مشکلی ندارند به صورت جداگانه
قصدم اینه اطلاعاتو بفرستم به دیتابیس و یا درصورت لزوم آپدیت کنم
مثلا الان کاربر گزینه های یکو دو سه رو انتخاب میکنه من رشته *1*2*3* رو داخل دیتابیس ذخیره میکنم
حالا میخاد اونو آپدیت کنه
من رشته *1*2*3* رو از دیتابیس میگیرم روی چک لیست باکس نمایش میدم
حالا کاربر گزینه 1 رو حذف میکنه گزینه 5 رو انتخاب میکنه
حالا من باید رشته *2*3*5* رو به دیتابیس بفرستم و آپدیت کنم
پس به هردو کار باهم احتیاج دارم
دقیقا من فقط اون رشته MyString رو لازم دارم
در کل از همه ممنون