PDA

View Full Version : مشکل با لیست باکس



کم حوصله
چهارشنبه 08 مرداد 1382, 19:11 عصر
سلام
من می خواهم 9 تا لیست را در کنار هم گذاشته و با هم کنترلشان کنم بدین صورت که همیشه ایندکس شان با هم برابر بوده و زمان حرکت برروی یکی تمامی به خرکت در بیایند الان من مشکلی که دارم اینکه زمانی که یکی از لیستها اسکرول میشه مابقی لیست ها خیلی کند حرکت کرده و عملا این حرکت به صورت پله پله انجام می شود چه کنم که همه با هم و یکدفعه حرکت کنند :(

A.Noor
پنج شنبه 09 مرداد 1382, 08:23 صبح
با سلام
اصل موضوع را بگویید که می‌خواهید چکار کنید . شاید راه بهتری برای آن وجود داشته باشه

سعید قدیری مقدم
پنج شنبه 09 مرداد 1382, 08:37 صبح
دوست عزیز اگر قصد نشان دادن اطلاعات رو داری و از پایگاه داده استفاده میکنی از
DBGrid استفاده کن و اگر با فایل های متنی کار میکنی از listview یا MSFlexGrid چون مشکلی رو که با چند listbox بوجود میاد داخل این کنترل ها پیش نمیاد

کم حوصله
پنج شنبه 09 مرداد 1382, 11:17 صبح
سلام
ببینید من می خواهم یکسری اطلاعات را نمایش بدهم و کاربر تعدادیش را انتخاب کنه حال اگر این اطلاعات را با هم در یک لیست باکس بگذارم اطلاعات در یک ردیف نمی مانند و عقب جلو می شود حال مجبورم از چند لیست استفاده کنم که اطلاعاتم مرتب باشد ضمنا لیست اول را خاصیت چک باکسش را فعال کرده و امکان انتخاب را به کاربر می دهم
حال هیچ کدام از شی datagrid,msflxgrid,mshflexgrid این خاصیت چک باکس را ندارند که از انها اسنفاده کنم پس مجبورم از لیست استفاده کنم و چون تعداد رکورد های من بالا است لیست اسکرول میشه و مشکل من اینجاست که چگونه وقتی یکی از لیست ها اسکرول میشه مابقی هم اسکرول شده و محسوس نباشد :cry:

Abbas Arizi
پنج شنبه 09 مرداد 1382, 11:36 صبح
شما حتی اگر مصر باشید که برای این کار از ListBox استفاده کنید، میتونید ListBox رو ستون بندی کنید تا مجبور نباشید از چند تا ListBox استفاده کنید. اگر خواستید بگید تا من کدش رو براتون اینجا بگذارم. ولی..
به نظر من به عنوان یک عضو ناچیز این سایت همیشه سعی کنید توی برنامه استانداردهای برنامه نویسی رو رعایت کنید. یعنی برای هر کاری از روشی استفاده کنید که اکثر برنامه نویسها برای اون کار استفاده میکنند. ضمن اینکه همیشه باید سعی کنید تا برنامه تون از لحاظ بکارگیری منابع حافظه در بهترین شرایط باشه و حافظه اضافی خرج نکنه.
استفاده از چنین روشی (استفاده از چند ListBox برای کنترل یک رکوردست) فکر میکنم تا حدودی با این ایده مغایرت داشته باشه.
البته همه اینها محض یادآوری بود و به هر حال صلاح مملکت خویش خسروان دانند.

کم حوصله
پنج شنبه 09 مرداد 1382, 12:07 عصر
خوب آقای عریزی ببخشید ها اگر من دنبال راه حل نبودم و می خواستم از روش که گفتم استفاده کنم که نمی آمدم اینجا راهنمایی بگیرم راه حل بهتری داری بگو ما هم از صمیم قلب ممنون می شیم :oops: اینقدر هم نیش و کنایه نزنی آقا :x

Abbas Arizi
پنج شنبه 09 مرداد 1382, 12:33 عصر
من اصلا به هیچ وجه اهل نیش و کنایه نیستم. خیلی هم توی حرفهام سعی کردم جوری بگم که این سو تفاهم پیش نیاد. فقط و فقط هدفم این بود که یک جوری شما دوست عزیز رو متوجه این مطلب که به نظرم مهم اومد و فکر میکنم برای خودتون مفیده بکنم.
به هر حال اگه براتون همچین تصوری پیش اومده که من قصد نیش و کنایه داشتم بسیار شرمنده ام :oops: :oops: :oops: و از شما عذرخواهی میکنم.
کد ستون بندی ListBox رو من الان امتحان کردم دیدم روی ListBox که CeckBox داشته باشه عمل نمیکنه ولی اگه راه حل بهتری به نظرم رسید اینجا مطرح میکنم.

S.Azish
پنج شنبه 09 مرداد 1382, 13:00 عصر
به نظر من شما می تونید از Listview استفاده کنید. امکانات چند ستونی بود و چک باکس رو هم داره.

Abbas Arizi
پنج شنبه 09 مرداد 1382, 13:02 عصر
یک راه حل خوب:
کنترل ListView که در Microsoft Windows Common Controls 6.0 و نه 5.0 قرار داره قابلیت نگهداشتن CheckBox رو داره. میتونید از اون استفاده کنید.

Abbas Arizi
پنج شنبه 09 مرداد 1382, 13:07 عصر
نمیدونم چرا اینجوری شده شاید من وآقای آذیش با هم نوشتیم که اونجوری شده ولی به هر حال من پاکش نکردم چون اون 5 و 6 میتونه مهم باشه. :lol: :wink:

کم حوصله
شنبه 11 مرداد 1382, 20:39 عصر
سلام
از هردو شما دوستان
آقای عریزی و آقای آذیش ممنونم که راهنمایی کردید ببخشید من را که دیر جواب را دیدم چون من چند روزی بود ماموریت بودم و خیلی دسترسی به شبکه را نداشتم بازم خیلی متشکرم و الان میرم این چیزی که گفتید را امتحان می کنم بازم مرسی :oops:

کم حوصله
شنبه 11 مرداد 1382, 22:14 عصر
:cry: میشه یکم بیشتر توضیح بدید
اولا این listwive خاصیت right to left نداره که برای من خیلی مهمه دوما چگونه یک رکورد به آن اضافه کنم سوم چنانچه یکی از فیلدها از یکی از ستونها مقدارش تغییر کرد چگونه در سیستم اجرا کنم چارم در کل بهم اگر ممکنه بگید در کل چگونه رکورد ایجاد کرده اصلح کرده ویا حذف کنم
ترجیحا اگر امکان داره یک نمونه مثال کوچولو برایم بفرستید :oops:
فقط تورا بخدا زود بدادم برسید دارد آبرویم می رود :cry: :(

Abbas Arizi
شنبه 11 مرداد 1382, 23:58 عصر
Right to left رو که باید بیخیال بشید (در حد اطلاعات من).
در خصوص اضافه کردن رکوردها امکان Bind شدن نداره (در حد اطلاعات من). بنابراین باید رکوردها رو یکی یکی به اون اضافه کنید. به این صورت:

ListView1.ListItems.Add Text:="FieldValue"
اما برای اینکه بصورت ستونی دیده بشه View اون را ابتدا باید به lvwReport تنظیم کنید. بعد باید ستونهارو اضافه کنید. توی Custom یا از در زمان اجرا این کد رو اجرا کنید:

ListView1.ColumnHeaders.Add text:="FieldName"
برای انکه فیلدهای دوم به بعد رو اضافه کنید باید از از ویژگی SubItem که مربوط به شیی ListItem میباشد، استفاده کنید:

ListView1.ListItems(1).SubItems(1) = "Field2Value"
اما برای تغییر هر کدوم از آیتمها کافیه که اون آیتم رو همراه اندیس یا کلید اون بنویسید و مقدار Text اون آیتم یا SubItem رو تغییر بدید.

ListView1.ListItems(1).Text = "NewValue"
یا:

ListView1.ListItems(1).SubItems(1) = "NewValue"
برای حذف یک آیتم باید از متد Remove رو ListItems اجرا کنید.

ListView1.ListItems.Remove 1

این هم یک نمونه:
همه اینهارو گفتم. نمیدونم اصلا به کار شما میاد یا نه؟ :?: :!:

Abbas Arizi
یک شنبه 12 مرداد 1382, 00:15 صبح
Right to left رو تا حدودی براتون درستش کردم ببینید راضیتون میکنه؟

کم حوصله
یک شنبه 12 مرداد 1382, 10:22 صبح
سلام
دوست عزیز آقای عریزی واقعا ممنون این همونه که من می خواستم فقط یک سئوال داشتم


Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim lvItm As MSComctlLib.ListItem

For i = 1 To 4
ListView1.ColumnHeaders.Add Text:="Fiedl" & i
Next

For i = 1 To 10
Set lvItm = ListView1.ListItems.Add(Text:="Record" & i)
For j = 1 To 3
lvItm.SubItems(j) = "Field Value" & j + 1
Next
Next

End Sub



شما متغییر lvitm را برای چه منظوری نوشتید در صورتی که طبق گفته های خودتان می توان این چنین هم نوشت



Private Sub Form_Load()
Dim i As Integer
Dim j As Integer

For i = 1 To 4
ListView1.ColumnHeaders.Add Text:="Fiedl" & i
Next

For i = 1 To 10
ListView1.ListItems.Add Text:="Record" & i
For j = 1 To 3
ListView1.ListItems(i).SubItems(j) = "Field Value" & j + 1
Next
Next

End Sub


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

Abbas Arizi
یک شنبه 12 مرداد 1382, 11:11 صبح
دقیقا همون چیزیه که شما میگید. استفاده از این روشها فرقی نداره.
این روشی که من استفاده کردم به خاطر اینه که ما همیشه که آیتمها رو توی حلقه به کنترل اضافه نمیکنیم. استفاده از این روش ما رو از به دست آوردن مجدد اندیس آیتم اضافه شده بی نیاز میکنه. فرضا شما این کد رو اجرا میکنید بدون اینکه از حلقه استفاده کنید:

ListView1.ListItems.Add (Text:=Field)
خب الان اگه بخواهید SubItem رو تنظیم کنید مجبورید دوباره اندیس آیتم اضافه شده رو پیدا کنید. (که معمولا آخرین ایتم هست)
ولی اگر از این روش استفاده کنید دیگه نیازی به این کار ندارید. چون اون آیتم جدید رو به عنوان یک شیی در اختیار دارید.
بنابراین بهتره که عادت کنیم همیشه از این روش استفاده کنیم.

کم حوصله
یک شنبه 12 مرداد 1382, 12:17 عصر
سلام
آقای عریزی واقعا ببخشید می دونم دستم کلافه اید می ترسم دیگه جوابم را ندی ببخشیدها
دو تا سئوال دیگه دارم :(
1- آقا چطور می شود فهمید که الان روی کدام سطر هستیم (شماره سطر)
2- نمشه زمانی که gridlines را true می کنیم فقط عمودی خط کشی کنه ( جدول نمی خواهم فقط ستونی )
ببخشید تورا به خدا اینقدر می پرسم ها :oops:

Abbas Arizi
یک شنبه 12 مرداد 1382, 14:46 عصر
در خصوص Grid باید بگم که متاسفانه همچین امکانی نداره.
برای به دست آوردن سطر انتخاب شده ListView یک ویژگی SelectedItem داره که یک شیی ListItem برمی گردونه که کلیه اطلاعات این شیی رو برمی گردونه و از روی Index اون میتونید شماره سط اون رو به دست بیارید

ListView1.SelectedItem.Index
یک روش دیگه هم داره که توی کدی که ضمیمه میکنم نشون داده میشه.
ضمنا این کد جدید right to left رو تقریبا کامل اعمال میکنه.
بعدم اینکه خواهش میکنم.
شما هر چقدر که سوال بپرسید من اگه خودم چیزی بلد باشم، خیلی خوشحال میشم که کمک کنم.