PDA

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



shahin60
شنبه 20 خرداد 1391, 23:17 عصر
88080
سلام به دوستان
همانطور توعکس می بینید میخوام زمانی که هر یک از ایتم های چک لیست باکس انتخاب شد مقدار اون در لیست باکس روبروش نمایش داده بشه وهرموقع هر یک از آیتم های چک باکس از حالت انتخاب خارج شدمقدار اون از لیست باکس حدف بشه
خیلی فوریه:خجالت:

shahin60
یک شنبه 21 خرداد 1391, 00:17 صبح
کسی بلد چی بنویسم کجا تو کدوم رویداد
لطفا کمک کنید

Mahmoud.Afrad
یک شنبه 21 خرداد 1391, 00:34 صبح
از رویداد آیتم چک استفاده کنید

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked && !listBox1.Items.Contains(checkedListBox1.Items[e.Index]))
listBox1.Items.Add(checkedListBox1.Items[e.Index]);
else if (e.NewValue == CheckState.Unchecked && listBox1.Items.Contains(checkedListBox1.Items[e.Index]))
listBox1.Items.Remove(checkedListBox1.Items[e.Index]);
}

Mahmoud.Afrad
یک شنبه 21 خرداد 1391, 00:38 صبح
دوست عزیز می تونی برای رویداد checkedchanged چک باکس هات از این کد استفاده کنی:

if (checkBox1.Checked == true)
{
listBox1.Items.Add(checkBox1.Name);
}
else
{
listBox1.Items.Remove(checkBox1.Name);
}

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

shahin60
یک شنبه 21 خرداد 1391, 01:04 صبح
ممنون این روشی که گفتید تو چک باکس لیست هم جواب می ده؟

Mahmoud.Afrad
یک شنبه 21 خرداد 1391, 01:24 صبح
اگر منظور شما از "چک باکس لیست" چک لیست باکس هست بله دیگه به کدها نگاه کنید میفهمید. اگر امتحان میکردید نیازی به پرسش دوباره نبود. همانطور که گفتم از رویداد آیتم چک مربوط به چک لیست باکس استفاده کنید.

shahin60
دوشنبه 22 خرداد 1391, 23:31 عصر
سلام میخوام هرکدوم انتخاب شد این طوری تو لیست باکس نمایش بده مثلا 20 که انتخاب کردم 20/05/1390 بشه این رو تو add اضافه کردم شد

"1390/05/" + chlist_date.Items[e.Index]

اما زمانی که تیک برمی دارم از لیست کم نمی شه باید تو remove چی بنویسم

Mahmoud.Afrad
دوشنبه 22 خرداد 1391, 23:42 عصر
توی کد پست3 هر جا
checkedListBox1.Items[e.Index] دیدی به جاش

"1390/05/" + chlist_date.Items[e.Index] بزار.

shahin60
دوشنبه 22 خرداد 1391, 23:47 عصر
و یه مورد دیگه ، حالا اطلاعات داخل لیست باکس به صورت تاریخ تو بانک ذخیره شدن ،حالا اگر بخوام اون ها رو از تو بانک بخونم وبریم تو لیست باکس مشکلی نیست ولی چطوری می تونم بگم که اون مورد ها تو چک باکس لیست هم تیک بخوره؟

shahin60
دوشنبه 22 خرداد 1391, 23:53 عصر
خیلی ممنونم از جواب های خوبتون
به نظر شما برای ذخیره تاریخ ها تو بانک به تعداد تاریخ ها فیلد تو جدولم بزارم یا یه فیلد از نوع ntext بزارم؟
اکر بخوام بگم کاربر نتونه بیشتر از 10 تا انتخاب داشته باشه چی بنویسم؟

Mahmoud.Afrad
سه شنبه 23 خرداد 1391, 00:36 صبح
برای ذخیره میتونید تاریخ رو همراه با روزهایی که انتخاب میشه رو به صورت یک رشته در بیارید (با یک کاراکتر خاص مثلا ویرگول روزها و تاریخ رو از هم جدا کنید) و بعد ذخیره کنید. برای بازیابی هم باید برحسب همون کاراکتر رشته را تفکیک کنید. بعد از بدست آوردن تاریخ و روزها میتونید تو یک حلقه تیک بزنید.

1391/03/,5,9,15

hamed_hossani
سه شنبه 23 خرداد 1391, 00:43 صبح
حرف n در نوع های داده اسکیو ال به معنای پشتیبانی حروف unicode فارسی()است
فکرکنم nVarChar(20)کافی باشه
برای تعداد 10 مورد در رویداد checkedListBox1_ItemCheck شرط بزار برای تعداد.

shahin60
سه شنبه 23 خرداد 1391, 01:08 صبح
برای ذخیره میتونید تاریخ رو همراه با روزهایی که انتخاب میشه رو به صورت یک رشته در بیارید (با یک کاراکتر خاص مثلا ویرگول روزها و تاریخ رو از هم جدا کنید) و بعد ذخیره کنید. برای بازیابی هم باید برحسب همون کاراکتر رشته را تفکیک کنید. بعد از بدست آوردن تاریخ و روزها میتونید تو یک حلقه تیک بزنید.

1391/03/,5,9,15

اخه من میخوام هر تاریخ به صورت مجزا تو لیست باکس باشه
و با اون موردی که گفتید تو بازیابی هم این کا رو نمی شه کرد

میشه کدشو بزارید؟ممنون میشم

hamed_hossani
سه شنبه 23 خرداد 1391, 01:22 صبح
هر رشته یک متد داره به نام split
string.split(',');
("رشته").split(',');
رشته ها رو تفکیک کن و در یک ارایه بریز و بعد خانه های ارایه رو بریز هر جا که خاستی.

string[] arrTemp =("field").split(',');

Mahmoud.Afrad
سه شنبه 23 خرداد 1391, 15:11 عصر
اخه من میخوام هر تاریخ به صورت مجزا تو لیست باکس باشه
و با اون موردی که گفتید تو بازیابی هم این کا رو نمی شه کرد

میشه کدشو بزارید؟ممنون میشم
اون پاسخ برای سوالی بود که شما کردید که چطور در دیتابیس(یا هر چیز دیگه) ذخیره کنید که من گفتم نیازی نیست به تعداد روزها (31) ، بیایید توی جدول دیتابیس ستون ایجاد کنید بلکه میتونید یک ستون از نوع varchar تعریف کنید. و اینکه تاریخ رو به همراه روزهایی که در چک لیست باکس تیک خوردند به صورت یک رشته دربیارید و در این ستون جدول ذخیره کنید.
برای بازیابی و اعمال اون روی چک لیست باکس، مقداری که در دیتابیس ذخیره شده رو سلکت میکنید و رشته رو تفکیک کنید و روی چک لیست باکس اعمال کنید
string st = "1391/03/,5,7,14";
private void button4_Click(object sender, EventArgs e)
{
List<string> items = new List<string>(st.Split(','));
items.RemoveAt(0);
foreach ( string s in items)
checkedListBox1.SetItemChecked(checkedListBox1.Ite ms.IndexOf(s) , true);
items = null;
}در اینجا من st رو با یک مثال پر کردم ، شما باید از مقداری که در دیتابیس ذخیره شده پرش کنید.

barnamenevisforme
سه شنبه 23 خرداد 1391, 15:26 عصر
سلام
هر دو روش جواب میده.
اگه یه فیلد از نوع ntext (در acceess) و یا از نوع nvarchar(در sql) انتخاب کنید بهتره،البته باید یه کد قراردادی برای خودتون قرار بدید که مثلا بین هر item تاریخ،یه ","بذاری و ذخیره کنی.
موقع بازخوانی از بانک و اعمال اون در برنامه،باید این کد رو دیکد کنی و هر مقدار رو توی یه آرایه ذخیره کنی.
با داشتن یه فیلد،واسه update و یا delete هم راحتتری.چون مقدار آرایه ها رو دوباره جمع میزنی،کد میکنی،میذاری توی یه فیلد.
روش دوم:
استفاده از جدول رابطه ای یک به چند
فیلد تاریخ های انتخاب شده مربوط به این جدول رو در خودش قرار ندی،یه جدول دیگه بساز،از طریق forien key متصل کن به جدول اول و تاریخ ها رو توی اون نگهداری کن.

shahin60
چهارشنبه 24 خرداد 1391, 14:10 عصر
اون پاسخ برای سوالی بود که شما کردید که چطور در دیتابیس(یا هر چیز دیگه) ذخیره کنید که من گفتم نیازی نیست به تعداد روزها (31) ، بیایید توی جدول دیتابیس ستون ایجاد کنید بلکه میتونید یک ستون از نوع varchar تعریف کنید. و اینکه تاریخ رو به همراه روزهایی که در چک لیست باکس تیک خوردند به صورت یک رشته دربیارید و در این ستون جدول ذخیره کنید.
برای بازیابی و اعمال اون روی چک لیست باکس، مقداری که در دیتابیس ذخیره شده رو سلکت میکنید و رشته رو تفکیک کنید و روی چک لیست باکس اعمال کنید
string st = "1391/03/,5,7,14";
private void button4_Click(object sender, EventArgs e)
{
List<string> items = new List<string>(st.Split(','));
items.RemoveAt(0);
foreach ( string s in items)
checkedListBox1.SetItemChecked(checkedListBox1.Ite ms.IndexOf(s) , true);
items = null;
}در اینجا من st رو با یک مثال پر کردم ، شما باید از مقداری که در دیتابیس ذخیره شده پرش کنید.


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

shahin60
چهارشنبه 24 خرداد 1391, 14:19 عصر
من باید دو نوع جستجو داشته باشم یکی بر اساس روز وماه ویکی بر اساس ماه حالا که یه رشتخ شده چطوری این کارو بکنم

shahin60
چهارشنبه 24 خرداد 1391, 14:36 عصر
متوجه شدم حتما به خاطر کدهای داخل chech itme هست.
در مورد جستجو چی؟

Mahmoud.Afrad
چهارشنبه 24 خرداد 1391, 14:46 عصر
من باید دو نوع جستجو داشته باشم یکی بر اساس روز وماه ویکی بر اساس ماه حالا که یه رشتخ شده چطوری این کارو بکنم
میتونید سه ستون داشته باشید یکی برای سال یکی برای ماه و یکی هم برای روزهای انتخابی و برای ذخیره هم میایید روزها رو به یک رشته تبدیل میکنید

1391 03 5,12,3,14برای جستجو براساس ماه یا سال که ساده است .برای جستجو براساس ماه یا سال با روز به اینصورت میتونید عمل کنید
select * from dbo.tbl where year='سال' and month='ماه' and day like '%روز%'

shahin60
سه شنبه 30 خرداد 1391, 15:53 عصر
سلام دوست عزیز
حالا به یه مشکل دیگه برخوردم
زمانی که اطلاعات روز ها فراخوانی میشه چک باکس لیست تیک می خوره وروزهای متناظر تو لیست باکس قرار می گیرن فقط نمی دونم چطور باید اون رشته روز ها رو بدست بیارم (منظورم اینکه روز جدیدی به رشته اضافه کنم ویا زمانی که تیک یه روز برداشتم از رشته روز ها اون رو کم کنه اصلا ایجاد یه رشته از مقادیر چکس باکس لیست چطوریه؟-ویه نکته زمانی که عمل split انجام می شه داده اولی نمایش داد نمی شه؟
ممنون میشه کمک کنید.

Mahmoud.Afrad
سه شنبه 30 خرداد 1391, 16:47 عصر
با همون حلقه مقادیری که چک خوردن رو میخونی و تبدیل به یک رشته میکنی کاری نداره.
برای اینکه مقادیری که از دیتابیس خوندی و روی چک لیست باکس اعمال کردی ، اگر بخوای تغییر بدی باید رشته رو دوباره ایجاد کنی و اون سطر دیتابیس رو آپدیت کنی.
در مورد split هم کدتون رو قرار بدید.

shahin60
سه شنبه 30 خرداد 1391, 16:51 عصر
با همون حلقه مقادیری که چک خوردن رو میخونی و تبدیل به یک رشته میکنی کاری نداره.
برای اینکه مقادیری که از دیتابیس خوندی و روی چک لیست باکس اعمال کردی ، اگر بخوای تغییر بدی باید رشته رو دوباره ایجاد کنی و اون سطر دیتابیس رو آپدیت کنی.
در مورد split هم کدتون رو قرار بدید.

میشه کدشو بزاری ممنون میشم؟
برا split همون کدی که گفتید
رشته اینه ,03,05,11,25

Mahmoud.Afrad
سه شنبه 30 خرداد 1391, 18:14 عصر
http://up98.org/upload/server1/02/j/ddvsotebwdyo2v06u1aw.rar

shahin60
پنج شنبه 01 تیر 1391, 00:40 صبح
باتشکر از راهنمایی هاتون
من اطلاعات داخل لیست باکس رو ترکیب کزدم
اینطوری می نویسه
1390/02/01
1390/02/12

حالا اون کدی که تو برنامه بود رو چطوری تغییر بدم:
label3.ResetText();
foreach (string item in listBox1.Items)
{
if (label3.Text == string.Empty)
label3.Text = item;
else
label3.Text += "," + item;
}

و یه مشکل دیگه بانک برنامه باز نشد چه ورژنیه؟

Mahmoud.Afrad
پنج شنبه 01 تیر 1391, 01:01 صبح
به نظر من ذخیره سازی رو با همون فرمت قبل انجام بدید بهتره و حجم کمتری اشغال میکنه ، فقط زمانی که میخواد به لیست باکس اضافه بشه سال و ماه رو هم بهش اضافه کنید.
دیتابیس هم sqlexpress2008 هست. چیز خاصی نداره یک جدول با ستون هایی که میبینیدhttp://up98.org/upload/server1/02/j/ibbkdpxont4nk0k2r6gc.png

shahin60
پنج شنبه 01 تیر 1391, 01:04 صبح
همونطوری روزها رو ذخیره می کنم ولی میخوام به کاربر اینطوری تو لیست باکس نشون بده
حالا روزها رو چطور ازش بکشم بیرون؟
یا بهتر نیست از چک لیست باکس ،روزها رو بگیرم؟

Mahmoud.Afrad
پنج شنبه 01 تیر 1391, 01:13 صبح
کافیه فقط کد رویداد ItemCheck رو به این صورت اصلاح کنی
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked)
{
listBox1.Items.Add(label1.Text + "\\" + label2.Text + "\\" + checkedListBox1.Items[e.Index]);

if (e.NewValue == CheckState.Checked)
if (label3.Text == string.Empty)
label3.Text = checkedListBox1.Items[e.Index].ToString();
else
label3.Text += "," + checkedListBox1.Items[e.Index].ToString();
}
else if (e.NewValue == CheckState.Unchecked)
{
listBox1.Items.Remove(label1.Text + "\\" + label2.Text + "\\" + checkedListBox1.Items[e.Index]);

label3.Text = label3.Text.Replace(checkedListBox1.Items[e.Index].ToString(), "").Replace(",,", ",");
if (label3.Text.StartsWith(","))
label3.Text = label3.Text.Substring(1);
if (label3.Text.EndsWith(","))
label3.Text = label3.Text.Substring(0, label3.Text.Length - 1);
}
} تابع itemstostring رو هم کلا پاک کنید.