PDA

View Full Version : نمایش اطلاعات با چند انتخاب



aliramazani
یک شنبه 28 دی 1393, 16:07 عصر
سلام
تصویر ضمیمه را نگاه کنید

در حالت عادی اگر به جای chekboxlist یک تکست باکس باشد و عددی داخل آن قرار گیرد با توجه به ایتمهای دیگر اطلاعات مربوط به آن عدد نمایش داده میشود.
این عدد در اینجا شماره سلولی هست که دارای مقادیری است. مثلا اگر سلول 1 را وارد کنم اطلاعاتی آن از قبیل دما و ... در بازه زمانی مشخصه نمایش داده میشود.

ولی در این تصویر من میخواهم چندین سلول یا عدد انتخاب کنم و اطلاعات سلولهای انتخاب شده در دیتاگرید ویوو نشان داده شود.
لطفا راهنمایی کنید

دیتابیس اکسس

sajadsobh
یک شنبه 28 دی 1393, 21:32 عصر
یعنی میخواین اطلاعات مربوط به چند سلول که توی یه جدول ذخیره شده رو توی یه gridview نمایش بدین؟

sajadsobh
یک شنبه 28 دی 1393, 21:42 عصر
SELECT * FROM Cell_Information
WHERE CellNumber IN (1,2,3)


فقط به جای اعدادی که جلوی IN نوشته شده باید شماره سلولهایی که از چک باکس ها انتخاب میشه رو بصورت رشته در بیارین و جلوی IN قرار بدین.

aliramazani
جمعه 03 بهمن 1393, 19:20 عصر
آفرین. دقیقا
چطوری باید به جای 1 و 2 و 3 شماره سلولهای تیک خورده قرار بگیره؟

sajadsobh
دوشنبه 06 بهمن 1393, 17:15 عصر
شما یه sp بنویس جای مقداری جلوی IN یه متغیر رشته ای بذار و بعد اون شماره سلول ها رو بصورت رشته به اون sp ارسال کن.
اگه نتونستی امشب اومدم واستون می نویسم.

sajadsobh
دوشنبه 06 بهمن 1393, 21:20 عصر
خب من sp رو به این شکل نوشتم:

create proc list
@MySting nvarchar(max)
as
begin
DECLARE @sql nvarchar(max)
IF(@MySting<>'')
SELECT @sql = 'SELECT * FROM Daneshjoo WHERE ID IN (' + @MySting + ')'
EXEC sp_executesql @sql
end

و حالا کافیه توی سی شارپ شما بیاین مقدار اون چک باکس ها رو بگیرین و بصورت رشته تحویل این sp بدین. من اومدم چندتا چک باکس توی فرم گذاشتم و این کد رو واسه پر کردن گرید نوشتم:

SqlConnection sqlCon = new SqlConnection("Server=.;Database=Test; Integrated Security=true");
string m = "";
foreach (Control X in this.Controls)
{
if (X is CheckBox && ((CheckBox)X).Checked)
{
m += X.Text + ",";
}
}

if (!string.IsNullOrEmpty(m))
{
m = m.Substring(0, (m.Length) - 1);
}

SqlDataAdapter da = new SqlDataAdapter("list", sqlCon);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@MySting", m);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView2.DataSource = dt;

هرجا رو که متوجه نشدین بگین بازم توضیح بدم.

sajadsobh
دوشنبه 06 بهمن 1393, 23:01 عصر
البته شما که از checkedListBox توی سی شارپ استفاده کردی کدنویسی به یه شکل دیگه میشه. من اینو نوشتم جواب داد:


SqlConnection sqlCon = new SqlConnection("Server=.;Database=Test; Integrated Security=true");
string m = "";

foreach (object itemChecked in checkedListBox1.CheckedItems)
{
m += itemChecked.ToString() + ",";
}

if (!string.IsNullOrEmpty(m))
{
m = m.Substring(0, (m.Length) - 1);
}

SqlDataAdapter da = new SqlDataAdapter("list", sqlCon);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@MySting", m);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView2.DataSource = dt;

sajaaaaad
سه شنبه 14 بهمن 1393, 15:47 عصر
با تشکر از توضیحات کامل و عالیتون. منم تا حالا با checkedlistbox کار نکردم و به مشکل خوردم. من دیتابیسمو بهش بایند کردم ولی نمیدونم چطور مقادیرشو بدست بیارم.
.
من با قطعه کد زیر داده ها مو نشون دادم. اینجوری...
.


objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = clsVariable.objConnection;
objDataAdapter.SelectCommand.CommandText = "SELECT * FROM tbl_Certificate";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objDataAdapter.Fill(objDataTable = new DataTable());
CheckedListBox1.DataSource = objDataTable;
CheckedListBox1.DisplayMember = "Cer_Name";
CheckedListBox1.ValueMember = "Cer_ID";

.
حالا چطور وقتی کاربر دکمه مثلا "تایید" رو میزنه تمام مقادیر چک دار شده رو بدست بیارم، مقدار ValueMember شون رو میخوام. حالا هر تعداد میخواد باشه.من خودم یک آرایه به تعداد طول checklistBox درست کردم ولی نمیدونم چطور مقادیر چکدار شده رو بهش بدم. لطفاً راهنمایی کنید. ممنون

sajadsobh
سه شنبه 14 بهمن 1393, 17:47 عصر
فکر کنم باید یه چک لیست باکس سفارشی بسازید. این لینک (http://www.codeproject.com/Articles/14916/Bindable-CheckedListBox) می تونه کمک کنه.

sajadsobh
سه شنبه 14 بهمن 1393, 18:00 عصر
این کلاس (http://www.uplooder.net/cgi-bin/dl.cgi?key=a1b242408260f175d9d40967296b3729) رو دانلود کنید. به قسمت کنترل ها اضافه کنید. یه نوع چک لیست باکس به کنترل ها اضافه میشه که DataSource, DisplayMember, ValueMember داره. حالا با استفاده از قطعه کد زیر می تونید اون چک لیست باکس رو پر کنید.

SqlConnection sqlCon = new SqlConnection("Server=.;Database=Test; Integrated Security=true");
SqlDataAdapter da = new SqlDataAdapter("select * from Daneshjoo", sqlCon);
DataTable dt = new DataTable();
da.Fill(dt);
exCheckedListBox1.DataSource = dt;
exCheckedListBox1.DisplayMember = "name";
exCheckedListBox1.ValueMember = "ID";

محمد آشتیانی
سه شنبه 14 بهمن 1393, 19:06 عصر
سلام

اول یک کلاس به نام (TestClass) تعریف میکنیم که شامل دو پراپرتی Display_ و Value_ هستش

class TestClass
{
private string _display;
private string _value;
public string _Display
{
get { return _display; }
set { _display = value; }
}
public string _Value
{
get { return _value; }
set { _value = value; }
}
public override string ToString()
{
return _Display;
}
}



حالا توسط یه متد (AddItems)، تعدادی آیتم آزمایشی داخل checkedListBox میریزیم

private void AddItems()
{
List<TestClass> lst = new List<TestClass>();
lst.Add(new TestClass() { _Display = "One", _Value = "1" });
lst.Add(new TestClass() { _Display = "Two", _Value = "2" });
lst.Add(new TestClass() { _Display = "Three", _Value = "3" });
lst.Add(new TestClass() { _Display = "Four", _Value = "4" });
lst.Add(new TestClass() { _Display = "Five", _Value = "5" });
((ListBox)checkedListBox1).DisplayMember = "_Display";
((ListBox)checkedListBox1).ValueMember = "_Value";
((ListBox)checkedListBox1).DataSource = lst;
}



و نهایتا با این متد (GetCheckedItems) ، آیتم های انتخاب شده رو درون یه لیست میریزیم

private void GetCheckedItems()
{
List<string> CheckValues = new List<string>();
foreach (Object c in checkedListBox1.CheckedItems)
{
CheckValues.Add(((TestClass)c)._Value);
}
}



اینجا چون من checkedListBox رو به دیتابیس بایند نکرده بودم ، برای داشتن DisplayMember و ValueMember مراحل 1 و 2 رو هم انجام دادم تا متوجه عملکرد کد بشید، بنابراین شما کافیه فقط مرحله سوم رو انجام بدید.



موفق باشید.

sajaaaaad
یک شنبه 19 بهمن 1393, 08:54 صبح
با سلام خدمت دوستان عزیز.
من باز به یک مشکل دیگه برخورد کردم.
من یک فرم دارم که داخلش تامین کننده ها ثبت میکنم. بعد تامین کننده ها احتمال داره چند نوع گواهینامه داشته باشن. مثلا iso 2000 و iso 2001 و ... برای همین من از لیست باکس استفاده کردم و این امکان رو به کاربر دادم که گواهینامه ها رو تعریف کنه و زمانی که تامین کننده رو تعریف میکنه بتونه گواهینامه ها رو هم انتخاب کنه. مثل شکل زیر.
128273

حالا سوال اینجاس:
من میخوام یک تامین کننده رو ویرایش کنم.! چیزی که من دارم شماره ردیف تامین کننده و شماره گواهینامه های اونه.! یا نام گواهینامه. چطور میشه وقتی دکمه ویرایش رو زد اون آیتمایی که ثبت شده خودش تیک دار بشه.
مثلا: آبکاری احمدی.، گواهینامه 2000 و 9000 رو داره، حالا که ویرایشو میزنم چطور بهش بگم اونی که 2000 هست یا 9000 هستو تیک بزن.!؟
مثلا میگم چیزی شبیه به این داره توی لیست باکس؟


forech var item in datatable
checklistboxike.name = item.name = chekeded true beshe

sajadsobh
یک شنبه 19 بهمن 1393, 16:56 عصر
منظورتون اینه که هر تامین کننده می تونه چند تا گواهینامه داشته باشه؟! شما واسه اینکه به هر تامین کننده یه گواهینامه بدین چیکار کردین؟

sajaaaaad
دوشنبه 20 بهمن 1393, 06:44 صبح
سلام، بله دیگه، گفتم که هر تامین کننده می تونه چندتا گواهینامه داشته باشه، واسه دادن گواهینامه ها هم از جدول جدا استفاده کردم.
مثلا:
جدول تامین کننده: ردیف، نام تامین کننده، تلفن تماس و ....
جدول گواهینامه ها: ردیف، نام گواهینامه و .... (این جدولیه که نامشون و مقدارشون توی چک لیست باکس میاد)
جدول کمکی: ردیف تامین کننده، ردیف گواهینامه
.
تا اینجاش مشکلی نیست من نوشتم و ذخیره هم کردم حالا موقعه ویرایش چطور بهش بفهمونم تامین کننده احمدی که مثلا دوتا گواهینامه 2000 و 9000 رو داره وقتی ویرایشو میزنه خودش اون دوتارو تیک بزنه، مثلا من یک select از دیتابیسم بگیرم که داخلش نام گواهینامه ها باشه، حالا به اون چک لیست باکس چطور بفهمونم همونایی که توی select هم است تیک بخوره (البته انگار اون سلکت توی دیتاتیبل میاد دیگه، باید بگم اونایی که توی دیتاتیبل هست تیک بخوره خودش اتوماتیک)
.
امیدوارم متوجه منظورم شده باشید. مرسی.

sajadsobh
دوشنبه 20 بهمن 1393, 20:41 عصر
خب من نمیدونم شما چک لیست باکس رو چطور مقدار دهی کردین. ولی کوئری مربوط به اون اینجوری میشه. شما باید بیای بببنی توی جدول کمکی که داری، از آیدی User ِ انتخابی چه آیدی هایی از گواهینامه ها هست. اگه آیدی user رو داشته باشیم میشه یه چیزی مثل این:

CREATE PROCEDURE Get_iso
@userID int
AS
BEGIN
SELECT isoID FROM Jadval_Komaki
WHERE userID = @userID
END

که به جای @userID شما باید آیدی user رو بعنوان پارامتر ارسال کنید. با این کوئری لیست تمام گواهینامه های مربوط به کاربری که آیدی ش رو فرستادید لیست میشه. حالا فقط کافیه توی سی شارپ بیاین این آیدی های بدست اومده رو واکشی کنین. من از این روش استفاده میکنم. یه ArrayList تعریف میکنم و همه آیدی ها رو توش میریزم و با یه دستور foreach ازشون استفاده میکنم.

public ArrayList GET_ISO(int UserID)
{
try
{
ArrayList ISO = new ArrayList();
SqlCommand cmd = new SqlCommand("Get_iso", SqlCon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@userID", UserID);
SqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (dr[1] != DBNull.Value)
ISO.Add(dr[1].ToString());
}
dr.Close();
return ISO;
}
finally
{
if (SqlCon.State != ConnectionState.Closed)
{
SqlCon.Close();
}
}
}

توی این تابع فقط باید UserID رو بفرستید. با فرض به اینکه آیدی ایزو ها ستون شماره 2 باشه ( که واسه همین من از dr[1] استفاده کردم) این تابع لیست ایزو آیدی های مربوط به UserID ارسالی رو توی یه ArrayList برمیگردونه. حالا موقع لود شدن چک لیست باکس با این روش می تونی مقداردهی کنی!

sajaaaaad
سه شنبه 21 بهمن 1393, 07:11 صبح
مرسی آقا سجاد، میشه باقیشم بگی چکار کنم.
من مشکل اصلیم با لیست باکسه
نگا من لیست باکسمو اینجوری پر کردم، خودمم نفهمیدم آخر چی شد ولی جواب کار منو میده، چون بعد از پر شدن میخوام مقادیرشو داشته باشم یه روش ترکیبی زدم با اون توضیحاتی که آقا محمد داد البته نمیدونم صحیح هست یا نه ولی جواب کار منو میده


private bool FillCertificateList()
{
try
{
objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection = clsVariable.objConnection;
objDataAdapter.SelectCommand.CommandText = "SELECT * FROM tbl_Certificate";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objDataAdapter.Fill(objDataTable = new DataTable());
List<clsCheckListBox> objCheck = new List<clsCheckListBox>();
for (int i = 0; i < objDataTable.Rows.Count; i++)
{
objCheck.Add(new clsCheckListBox() { Display = objDataTable.Rows[i][1].ToString(), Value = objDataTable.Rows[i][0].ToString() });
}
clbCertificate.DataSource = objCheck;
clbCertificate.DisplayMember = "Display";
clbCertificate.ValueMember = "Value";


return true;
}
catch
{
FMessegeBox.FarsiMessegeBox.Show("فرم برنامه به صورت اتوماتیک بسته میشود، لطفا دوباره تلاش کنید\nدر صورت مشاهده مجدد این خطا با پشتیبانی تماس بگیرید", "خطـــا",
FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
this.Close();
return false;
}
}

.
حا با فرض اینکه طبق کدهای شما من آی دی های ایزوهارو در اوردم، لیست باکسمم که طبق کد بالا پر شده.!
حالا من یک تامین کننده رو انتخاب میکنم و ویرایشو میزنم.، فرم ویرایش که اومد بالا من میخوام اون گواهینامه هایی که طبق کد شما آی دی هاشو در اوردم تیک بخوره.! اینو چکار کنم.
میخوام بگم
توی لیست باکسی که (طبق کد خودم) پر شده--- اوناییی که آی دی شون (طبق کد شما) توی IsoID هست --- تیک بخوره

sajadsobh
پنج شنبه 23 بهمن 1393, 16:36 عصر
سجاد جان متأسفانه منم خیلی دنبال این موضوع گشتم ولی نتونستم راه حلی واسش پیدا کنم. بدست آوردن آیدی ها کار مشکلی نیست، اینکه بشه با استفاده از مقادیر value آیتم های این چک لیست باکس رو تیک زد مسئله اصلیه که من هیچ چیزی پیدا نکردم. از دوستانِ دیگه تقاضا دارم اگه می تونند کمک کنند.

sajaaaaad
جمعه 24 بهمن 1393, 00:55 صبح
مرسی آقا سجاد لطف کردین. منم چند وقته در گیر این موضوعم. برنامم باید تا آخر سال تحویل بدم حسابی رو اعصابمه. دوستان عزیز اگ راه حلی دارن بگن ممنون میشم.
باتشکر
:ناراحت: