ورود

View Full Version : ListBox



rika_vazy
یک شنبه 23 تیر 1387, 10:17 صبح
می خواستم با دابل کلیک کردن بر روی ایتم یک list box که با بانک اطلاعاتی پر میشه .تمام رکورد مورد نظر مربوط به همان ایتم بر روی سطر دیتا گراید نمایش داده شود.

davood-ahmadi
یک شنبه 23 تیر 1387, 10:58 صبح
خوب روش این کار به این شکل است که با دبل کلیک کردن کاربر روی ردیف مورد نظر شما باید شماره یونیکی که در آن فیلد وجود دارد را بگیرید و فرم و دیتاگریدی را که دارید فراخوانی کنید که فقط اطلاعات مربوط به آن شماره را به شما نشان دهد.(فیلتر و یا کووری)

rika_vazy
یک شنبه 23 تیر 1387, 15:56 عصر
من ادی ایتم مورد نظرم می گیرم بعد باdataAdepter و dataset نمایش می دم ولی فقط برای یک کالا انجام میشه .
اگه امکان داره این کد رو برام بنویسید.

rika_vazy
دوشنبه 24 تیر 1387, 11:07 صبح
کسی نمی دونه

naeeme
دوشنبه 24 تیر 1387, 12:39 عصر
شما کدتون رو بذارین تا ایراد اون کد گرفته بشه

rika_vazy
دوشنبه 24 تیر 1387, 15:01 عصر
'***************************گرفتن id مورد نظر
ol_cm = New OleDbCommand("select id_kol from moarefi_kala where name_kala='" & ListBox2.Text & "'", ol_cn)
dr = ol_cm.ExecuteReader
If dr.HasRows = TrueThen
dr.Read()
listbox_idkol = dr("id_kol")
dr.Close()
EndIf
"*****************************حالا جستجو میکنه بر حسب ایدی و پیدا کردن رکورد مورد نظر و نمایش در جدول
ol_cm = New OleDbCommand("select * where id ='" & listbox_idkol & "'", ol_cn)
ol_da = New OleDbDataAdapter(ol_cm)
ds = New DataSet
ol_da.Fill(ds, "moarefi_kala")
DataGridView4.DataSource = ds.Tables("maorefi_kala")

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

naeeme
دوشنبه 24 تیر 1387, 15:07 عصر
خوب با این کدی که الان نوشتین، کد داره درست عمل می کنه اما شما نتوستین کدی که در واقع منظورتون بوده رو بنویسین!
اگر می خواین چند آیتم رو انتخاب کنین و اونها رو با هم نمایش بدین، باید از SelectedItems استفاده کنین.

این کد


ol_cm = New OleDbCommand("select id_kol from moarefi_kala where name_kala='" & ListBox2.Text & "'", ol_cn)


به کد زیر تبدیل میشه


strQuery = "select id_kol from moarefi_kala where "
for i=0 to listBox1.SelectedItems.Count
strQuery &= " name_kala= " & listBox1.SelectedItems[i].ToString() & ","
Next
strQuery = strQuery.TrimEnd(",")
ol_cm = New OleDbCommand(strQuery)

rika_vazy
دوشنبه 24 تیر 1387, 15:40 عصر
فکر کنم سوال خودمو بد توضیح دادم
(بر روی یک ایتم از ایتم های لیست باکس دابل کلیک می کنیم که با اینکار کل اطلاعات مربوط به ایتم انتخاب شده از لیست باکس در یک سطر از گراید نمایش داده میشه.
بعد یک ایتم دیگه از لیست باکس انتخاب می کنیم اطلاعات جدید در سطر بعدی از دیتا گرید نمایش داده میشه)

naeeme
سه شنبه 25 تیر 1387, 08:52 صبح
حالا شد! در واقع شما می خواین با انتخاب هر آیتم، یک سطر به گرید اضافه بشه!
1) از DataTable به جای DataSet استفاده کنین
2) یه DataTable بگیرین. بعد هر رکوردی که از جدول می خونید رو به این DataTable اضافه کنین و همین DataTable رو به DataGridViewتون باند کنین.
یه چیزی شبیه این کد رو می تونین بنویسین( فقط ایده بگیرید)




Sub FillGrid(ByVal strConnection As String)
Dim sqlConn As SqlConnection
Dim SqlCmm As SqlCommand
Dim sqlDataAdapter As Data.SqlClient.SqlDataAdapter
Dim strQuery As String
Dim dtResult As New DataTable
Dim dtTemp As New DataTable
Dim drTemp As DataRow

'''''
'''' کدهای مربوط به در آوردن آی دی را در این قسمت بنویسید
''''


'''' این قسمت برای اتصال به گرید است.
strQuery = "select * where id ='" & listbox_idkol & "'"
sqlConn = New SqlConnection(strConnection)
SqlCmm = New SqlCommand(strQuery, sqlConn)
sqlDataAdapter = New SqlDataAdapter(SqlCmm)

sqlDataAdapter.Fill(dtResult)
'''' اگر نتیجه ای داشت
If dtResult.Rows.Count > 0 Then
'''' اگر قبلا داده ای در گرید بود
If Not IsNothing(DataGridView1.DataSource) Then
dtTemp = CType(DataGridView1.DataSource, DataTable)
Else
'''' اگر داده ای در گرید نبود
DataGridView1.DataSource = dtResult.Copy()
Exit Sub
End If
'''' رکوردهایی که از دستور اخیر حاصل شده اند را به رکوردهای قبلی اضافه می کند
For Each drResult As DataRow In dtResult.Rows
drTemp = dtTemp.NewRow()
'''' فیلدهای رکورد ها را کپی می کند
For i As Integer = 0 To drResult.ItemArray.Length - 1
drTemp(i) = drResult(i)
Next
dtTemp.Rows.Add(drTemp)
Next
DataGridView1.DataSource = dtTemp.Copy()
End If
End Sub

saman_itc
سه شنبه 25 تیر 1387, 10:47 صبح
برای ضافه کردن به listbox از همین روش باید استفاده کرد؟

naeeme
سه شنبه 25 تیر 1387, 11:24 صبح
برای ضافه کردن به listbox از همین روش باید استفاده کرد؟

اگر منظورتون کدی هست که من نوشتم، روشی بهتر از این روش برای اضافه کردن به لیست کنترلهایی نظیر گرید، کمبو و لیست باکس، به ذهن من نرسیده!

rika_vazy
شنبه 29 تیر 1387, 13:16 عصر
بابت این کد ممنونم
کتابی یا مقاله ای هست که این کدها رو داشته باشه و بیشتر توضیح بده

naeeme
شنبه 29 تیر 1387, 14:24 عصر
بابت این کد ممنونم
کتابی یا مقاله ای هست که این کدها رو داشته باشه و بیشتر توضیح بده
نمی دونم! این کدهایی که نوشتم، تجربی بود و فکر نکنم در کتابی اینقدر ریز به این مسائل پرداخته بشه! تا حدی میشه از کتابها آموخت، بعد از اون باید کدهای زیادی دید تا ابتکارات برنامه نویسان دیگه رو دید و ازشون یاد گرفت.

rika_vazy
یک شنبه 30 تیر 1387, 10:08 صبح
برنامه ای که نوشتم به این صورت است که وقتی روی سلول اول گراید کلیک میشه listbox باز میشه و از توی لیست باکس میتونه ایتم های مورد نظرشو انتخاب کنه .مشکل اینجاست که در سطر اول لیست باکس نشون داده میشه ولی در سطر های بعدی این عمل انجام نمی شه و یه مشکل دیگه اینکه چطور میشه ایتم های تکراری داخل دیتا گراید نمایش داده نشه یعنی چک کنه اگه ایتم در گراید بود نمایش نده ممنون


If DataGridView4.Rows(e.RowIndex).Cells(0).Selected = TrueThen
frm10_search.ShowDialog()
EndIf

naeeme
یک شنبه 30 تیر 1387, 11:00 صبح
برنامه ای که نوشتم به این صورت است که وقتی روی سلول اول گراید کلیک میشه listbox باز میشه و از توی لیست باکس میتونه ایتم های مورد نظرشو انتخاب کنه .مشکل اینجاست که در سطر اول لیست باکس نشون داده میشه ولی در سطر های بعدی این عمل انجام نمی شه


If DataGridView4.Rows(e.RowIndex).Cells(0).Selected = TrueThen
frm10_search.ShowDialog()
EndIf


این کدی که نوشتین، چه ارتباطی به لیست باکس داره؟؟؟؟ یعنی شما لیست باکستون رو توی گرید انداختین و حالا در سطرهای بعدی گرید، لیست باکس به نمایش در نمیاد؟؟
اگر اینطوره، فکر کنم msdn یه sample کامل داشت( مطمئن نیستم)

rika_vazy
یک شنبه 30 تیر 1387, 11:21 صبح
این کد رو در event دیتاگراید قسمت
CellMouseClick نوشتم .. که با این کد وقتی روی سلول اول گراید کلیک شد لیست باکس نشون داده میشه...............

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

naeeme
یک شنبه 30 تیر 1387, 12:03 عصر
اون شرطی که گذاشتین صحیح نیست. کافیه بررسی کنید که e.CellIndex برابر صفر هست یا نه.


برای مشکل دومتون هم کافیه با استفاده از متد Select مربوط به Datatable ابتدا ببینید در Datatable یی که می خواین بهش رکورد اضافه کنین، آیا رکورد موردنظرتون وجود داره؟ اگر وجود داشت دیگه عملیات اضافه کردن رکورد رو انجام ندین.
چگونگی استفاده از متد Select (http://msdn.microsoft.com/en-us/library/system.data.datatable.select(VS.71).aspx)