Parsi Coders
ListView Microsoft Common Control 6.0 - نسخه قابل چاپ

+- Parsi Coders (http://parsicoders.com)
+-- انجمن: Software Development Programming (http://parsicoders.com/forumdisplay.php?fid=37)
+--- انجمن: Visual Basic Programming (http://parsicoders.com/forumdisplay.php?fid=39)
+---- انجمن: Visual Basic 6 (http://parsicoders.com/forumdisplay.php?fid=44)
+---- موضوع: ListView Microsoft Common Control 6.0 (/showthread.php?tid=341)



ListView Microsoft Common Control 6.0 - Amin_Mansouri - 06-06-2011

قبل از اینکه اموزش ListView رو بدم شما به این اشیا نیاز دارید
توضیح : ListView در قسمت component وی بی و در بخش Microsoft common control 6.0 است
یک عدد ListView که اونو فقط روی فرم قرار بدید
یک عدد imageList1 که فقط یک ایکون 16*16 درونش قرار بدید
یک عدد دیگر ImageList2 که فقط یک ایکون 32*32 درونش قرار بدید
بخش اول : اضافه کردن ایتم ها به ListView
برای اینکه بتوانیم با ListView هر کاری را انجام دهیم ابتدا باید تعدادی ایتم به ان اضافه کنیم. این کار اسان است.همه چیزی که شما احتیاج دارید این است که یک شی از ListItem بسازید و سپس به یک خط برای ساختن ایتم احتیاج خواهیم داشت. به مثال زیر توجه کنید
کد:
Dim itmx As ListItem
Set itmx = ListView1.ListItems.Add(, , "Item1")
این همه ان چیزی است که برای یک ایتم ساده به ان احتیاج داریم. کد بالا را به رویداد لود فرم بیافزاید و اجرا کنید. شما میتوانید ان ایتم را در ListView ببینید. اما تا اندازه ای ساده به نظر میرسد. در اینجا هیچ تصویری نمایش داده نشده است. برای نمایش تصاویر در ListView شما باید ان را به یک کنترل Image List (یا چند کنترل Image List) الحاق کنید. برای انجام این کار فقط روی خاصیت Custom کلیک کنید و زمانی که صفحه خواص برای ListView نمایش داده شد روی برگه Image List کلیک کنید. برای گزینه Normal Image List > Image List1 را انتخاب کنید و برای گزینه Small Image List > Image List2 را انتخاب کنیدو سپس خارج شوید. حالا شما تصاویری را خواهید داشت که با اجرای برنامه برای هرکدام از ایتم ها خواهید داشت. بزودی تصاویر بسیاری را خواهیم داشت. برای اینکه هنگام اجرا تصویر شماره 1 از Image List1 و تصویر شماره 1 از Image List2 را نمایش دهیم فقط کافی است کد زیر را بنویسیم :
کد:
Dim itmx As ListItem
Set itmx = ListView1.ListItems.Add(, , "Item1",1,1)
حالا برنامه رو اجرا کنید
بخش دوم >> تغییر نما
چندین راه برای نمایش اطلاعات در ListView وجود دارد. مثلا میتوانید به مرورگر ویندوز نگاه کنید که میتوانید نمایش اطلاعات را در ان تغییر دهید . مثلا به شکا نمایش ایکون به شکا بزرگ یا نمایش ایکون به شکل کوچک یا ... برای دیدن هر کدام از حالات مختلف ان را در رویداد لود فرم قرار داده و اجرا کنید
کد:
Dim itmx As ListItem
Dim colx As ColumnHeader
'Add a bunch of items
Set itmx = ListView1.ListItems.Add(, , "Item1", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item2", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item3", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item4", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item5", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item6", 1, 1)
Set itmx = ListView1.ListItems.Add(, , "Item7", 1, 1)
'Force window to be shown.
'This is just so you can see what is happening or else the
'messages would come up and the window would not have
'appeared yet
Me.Show
'Set the listview to icon
ListView1.View = lvwIcon
MsgBox ("You are now viewing the list in Icon View")
'Set the listview to small icon
ListView1.View = lvwSmallIcon
MsgBox ("You are now viewing the list in Small Icon View")
'Set the listview to list
ListView1.View = lvwList
MsgBox ("You are now viewing the list in List View")
'Add a column at runtime
'You can do this ahead of time in the controls
'property pages
Set colx = ListView1.ColumnHeaders.Add(, , "Name")
'Set the listview to report
ListView1.View = lvwReport
MsgBox ("You are now viewing the list in Report View")
در اینجا شما فقط باید خواص ListView را تنظیم کنید. ببینید که شما میتوانید نمای هر کدام انها را تغییر دهید
بخش سوم >> کار کردن با ستون ها
ایا بخاطر دارید نمای Report را در مرورگر ویندوز به شکل چی دیدید؟ دران حالت بصورت چند ستونی است و شامل : نام فایل و اندازه و .. است ممکن است مشکل به نظر برسد من به شما اطمینان میدهم که خیلی ساده است
این کدها را اجرا و بررسی کنید که هر کدام بعد از این کد دارای توضیحاتی هستند
کد:
Dim itmx As ListItem
Dim colx As ColumnHeader
'Add some columns
Set colx = ListView1.ColumnHeaders.Add(, , "Filename")
Set colx = ListView1.ColumnHeaders.Add(, , "Type")
Set colx = ListView1.ColumnHeaders.Add(, , "Size")
Set colx = ListView1.ColumnHeaders.Add(, , "Date")
'Add an item. The text here is always the
'First Column (Index 0)
Set itmx = ListView1.ListItems.Add(, , "Abstract.exe", 1, 1)
'Here is how we access each of the columns
itmx.SubItems(1) = "Program File"
itmx.SubItems(2) = "15 KB"
itmx.SubItems(3) = "10/10/1999"
'Set the listview to report
ListView1.View = lvwReport
شما می توانید ببینید که ما فقط به اضافه کردن تعدادی از ستونها احتیاج داشتیم مانند مثال قبلی. تفاوتی که در اینجا وجود دارد این است که ما به SubItem ها در یک ListItem دسترسی داریم. وقتی شما ابتدا یک ایتم متن را اضافه کنید ان را در Column(0) دریافت خواهید کرد.سپس برای قرار دادن متن در ستونهای دیگر ما لازم است که متن را به هر کدام از زیر ایتمها انتقال دهیم.برای مثال بالا من خودم را برای اضافه کردن تصاویر به header ستونها دردسر ندادم امل اگر شما از VB6 استفاده میکنید میتوانید این کار را نیز انجام دهید.
بخش چهارم >> رویدادهای ListView
در اینجا دو تا از رویدادهای اصلی که شما هنگام کار با ListView واقعا به انها احتیاج داردید توضیح میدهم. رویدادهای itemClick و ItemCheck.
رویداد ItemClick وقتی روی میدهد که روی لیست ایتمها کلیک شده باشد. این رویداد شی ListItem را که روی ان کلیک شده است را بر میگرداند و بنابراین شما میتوانید با ان هر کاری را که لازم است انجام دهید.پس این کد را به مثال قبلی اضافه کنید
کد:
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
MsgBox Item.Text
End Sub
وقتی شما برنامه را اجرا کنید و روی هر کدام از ایتمها در ListView کلیک کنید یک پیغام مبنی حاوی متن ایتمی که روی ان کلیک شده نمایش میدهد
رویداد دیگر برای وقتی است که شما حالتی را استفده کرده باشید که کنار هر کدام از ایتمهای ListView یک جعبهچک نمایش داده شده باشد. این کد را به رویداد لود فرم اضافه کنید:
ListView1.Checkboxes = True
وقتی شما برنامه را اجرا کنید متوجه خواهید شد که یک جهبه چک در کنار هر کدام از ایتم ها داده شده است. ممکن است تا زمانی که روی ListView کلیک نشود ان را به روز نکند ( به نظر میرسد این یکی از باگهای VB باشد). اما اگر شما مقادیر جعبه چکها را در زمان طراحی تغییر دهید ان را بدرستی نمایش خواهد داد. برای انجام دادن کاری در زمان که کاربر جعبه چکها را تیک میزند و یا تیک را برمیدارد شما باید کد زیر را در رویداد ItemCheck قرار دهید.
Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
If Item.Checked Then
MsgBox "Box is being checked"
Else
MsgBox "Box is being unchecked"
End If
End Sub
بخش پنجم >> مرتب کردن ListView بوسیله ستون ها:
در این بخش ما میخواهیم ایتم های را در حالت Report به ListView اضافه کنیم و وقتی که کاربر روی عنوان یکی از ستونها کلیک کرد میخواهیم ایتم های موجود در ListView را بر اساس همان ستون مرتب کنیم. اگر کاربر روی همان ستون دوباره کلیک کرد این مرتب سازی بین حالت صعودی و نزولی تغییر کند. ابتدا نگاهی به کد زیر میاندازیمکه تا اندازه ای واضح است:
کد:
Private Sub Form_Load()
Dim itmx As ListItem
Dim colx As ColumnHeader
'Add Some Columns
Set colx = ListView1.ColumnHeaders.Add(, , "Col1")
Set colx = ListView1.ColumnHeaders.Add(, , "Col2")
'Add two items
Set itmx = ListView1.ListItems.Add(, , "ABC")
itmx.SubItems(1) = "XYZ"
Set itmx = ListView1.ListItems.Add(, , "XYZ")
itmx.SubItems(1) = "ABC"
'Set the view to report
ListView1.View = lvwReport
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As
MSComctlLib.ColumnHeader)
'Check if the Sortkey is the same a the current one
If ListView1.SortKey <> ColumnHeader.Index - 1 Then
'When a column is clicked set the sortkey
'to the columnheader index -1
ListView1.SortKey = ColumnHeader.Index - 1
ListView1.SortOrder = lvwAscending
Else
'If the column is already selected then change the
'sortorder to be the opposite of what is currently
'being used
ListView1.SortOrder = IIf(ListView1.SortOrder = lvwAscending, _
lvwDescending, lvwAscending)
End If
'Set the sorted property to use the new sortkey
'and sort the contents
ListView1.Sorted = True
End Sub
بنابراین وقتی کاربر روی یک ایتم کلیک میکند رویداد Column_Click رخ میدهد که مرجعی به شی ColumnHeader که کلیک شده است برمیگرداند. در این کد ما این را برای دسترسی به خاصیت index برای مقدار دهی SortKey از کنترل ListView بکار برده ایم ( SortKey فقط میگوید ListView چگونه مرتب شود ) وقتی که این کامل شد ما مقدار خاصیت Sorted کنترل ListView را به True مقدار میدهی.این اطمینان حاصل میکند که کنترل مرتب شده است و بوسیله این تغییرات در SortKey منعکس شده و نمایش داده شود. اگر همان ستون دوباره کلیک شد سپس ما نوع مرتب سازی را تغییر میدهیم و ان را برابر عکس روش فعلی قرار میدهیم
بخش ششم >> ذخیره کردن عناوین ستونهای مرتب شده :
ایا تاکنون شما برنامه های را دیده اید که چیزهایی را در ان مطابق میلتان تنظیم کرده اید و سپس از برنامه خارج شده و وقتی که دوباره به برنامه برگشته اید همه تنظیمات ان به حالت پیش فرض برگشته است و هیچ کدام از تنظیمات مورد نیاز شما را ذخیره نکرده باشد؟ این مساله بی نهایت ازار دهنده است و نشان دهنده یک برنامه نویسی ضعیف است. برای کنترل ListView این مساله در رابطه با ColumnHeader صدق میکند. اگر شما اجازه دهید که کاربر اندازه یا نوع مرتب سازی ستونها را تغییر دهد باید این تنظیمات را ذخیره کنید بنابراین دفعه بعد که کاربر از برنامه شما استفاده کند این تنظیمات را در اختیار خواهد داشت. در اینجا کدی را که شما برای انجام دادن این کار نیاز دارید قرار دادم البته بیشتر کدها رو قبلا گفتم و فقط یه مقدارش جدید است
کد:
Private Sub Form_Load()
Dim colx As ColumnHeader
'Let the user reorder the columns
ListView1.AllowColumnReorder = True
'Set view to report
ListView1.View = lvwReport
'Add some columns
Set colx = ListView1.ColumnHeaders.Add(, , "Col1")
Set colx = ListView1.ColumnHeaders.Add(, , "Col2")
Set colx = ListView1.ColumnHeaders.Add(, , "Col3")
Set colx = ListView1.ColumnHeaders.Add(, , "Col4")
Set colx = ListView1.ColumnHeaders.Add(, , "Col5")
Set colx = ListView1.ColumnHeaders.Add(, , "Col6")
'Loop though each ColumnHeader object and set the
'position of it dependent on what the user did
'the last time
For Each colx In ListView1.ColumnHeaders
colx.Position = GetSetting(App.Title, "Settings", "Col" & colx.Index,colx.Index)
colx.Width = GetSetting(App.Title, "Settings", "ColWidth" & colx.Index, colx.Width)
Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim colx As ColumnHeader
'Save the Position of each of the ColumnHeader
'Objects so we can load them the next time
'the user starts the program
For Each colx In ListView1.ColumnHeaders
SaveSetting App.Title, "Settings", "Col" & colx.Index,ListView1.ColumnHeaders(colx.Index).Pos ition
SaveSetting App.Title, "Settings", "ColWidth" & colx.Index,ListView1.ColumnHeaders(colx.Index).Wid th
Next
End Sub
رویداد Unload فرم تا زمانی که همه ColumnHeader ها در کنترل ListView را بدست اورده و مکان و اندازه (عرض) انها را ذخیره کند ادامه پیدا میکند.سپس دفعه بعد که برنامه اجرا شود در رویداد لود فرم این خواص اشاره شده و مقادیر انها را به اشیای ColumnHeader خاص برمی گردانیم.