PDA

View Full Version : نامرئی کردن تعدادی از ستونها



f.nabavi
سه شنبه 20 اسفند 1387, 12:46 عصر
سلام. من یه دیتاگرید دارم که میخوام موقع چاپ به انتخاب کاربر یه تعدادی از ستون ها نمایش داده نشه. می خوام در قسمت header هر ستون یه چک باکس بذارم. آیا این ممکنه؟ یا کسی راه دیگه ای به ذهنش میرسه که بدون باز کردن یه فرم دیگه مثل تنظیمات کاربر بتونه یه تعدادی از ستونها رودر همون جدول invisible کنه؟

anooshiran
چهارشنبه 21 اسفند 1387, 00:15 صبح
سلام دوست عزيز

براي Invisible كردن يك ستون از datagridview در زمان اجرا راه حل هاي گونا گوني هست.
يكي از اين راه حل ها اين است كه ميتواني يك از طريق افزودن
ContextMenuStrip به Datagridview و قراردادن يك آيتم براي آن و كليك بروي آن آيتم كنترل را به event از پيش ساخته اي فرستاد و در آنجا invisible را برابر False قرار دا .

قطعه كد زير طريقه اين عمل را به شما نشان ميدهد. اگر بر روي هر cell از DatagridView كليك راست Right Click كنيد ContextMenuStrip نمايش داده خواهد شد و با كليك بروي آيتم مخفيvisibility ستون متعلق به Cell برابر False خواهد گرديد.




PrivateSub DataGridView1_MouseClick(ByVal sender AsObject, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseClick
If e.Button = Windows.Forms.MouseButtons.Right Then
Dim hit As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)
If hit.Type = DataGridViewHitTestType.Cell Then
DataGridView1.CurrentCell = DataGridView1.Item(hit.ColumnIndex, hit.RowIndex)
DataGridView1.ContextMenuStrip = New ContextMenuStrip
Dim menuItem AsNew ToolStripMenuItem

menuItem.Text = "مخفي"
AddHandler menuItem.Click, AddressOf MenuItem_Click
DataGridView1.ContextMenuStrip.Items.Add(menuItem)
DataGridView1.ContextMenuStrip.Show(DataGridView1, New Point(e.Location.X, e.Location.Y))
EndIf
EndIf
EndSub

PrivateSub MenuItem_Click(ByVal sender AsObject, ByVal e As System.EventArgs)
Dim ColName AsString
ColName = DataGridView1.Columns(DataGridView1.SelectedCells. Item(0).ColumnIndex).Name
DataGridView1.Columns(ColName).Visible = False
If DataGridView1.ContextMenuStrip.Created Then
DataGridView1.ContextMenuStrip.Dispose()
EndIf
EndSub

f.nabavi
چهارشنبه 21 اسفند 1387, 14:07 عصر
آقای anooshiran عزیز از لطف شما ممنون، ولی من میخوام در حد امکان داخل خود header ها چک باکس بذارم. اگر راه حلی دیدی ما رو فراموش نکن.

anooshiran
پنج شنبه 22 اسفند 1387, 15:13 عصر
سلام دوست عزيز

كلاس
DataGridViewCheckBoxColumnHeaderCell را برايت نوشته ام و همراه يك نمونه در فايل زير آپلود كرده ام.

اميدوارم مشكلت را حل كند.

سئوالي بود در خدمت هستم

scream666_ss
پنج شنبه 05 شهریور 1388, 13:45 عصر
سلام دوست عزيز

براي Invisible كردن يك ستون از datagridview در زمان اجرا راه حل هاي گونا گوني هست.
يكي از اين راه حل ها اين است كه ميتواني يك از طريق افزودن
ContextMenuStrip به Datagridview و قراردادن يك آيتم براي آن و كليك بروي آن آيتم كنترل را به event از پيش ساخته اي فرستاد و در آنجا invisible را برابر False قرار دا .

قطعه كد زير طريقه اين عمل را به شما نشان ميدهد. اگر بر روي هر cell از DatagridView كليك راست Right Click كنيد ContextMenuStrip نمايش داده خواهد شد و با كليك بروي آيتم مخفيvisibility ستون متعلق به Cell برابر False خواهد گرديد.


سلام

من این کد را استفاده کردم و کاملا درست کار می‌کنه، ممنون و متشکر اما یه مشکله جدید برخود کردم. من یک تابع دارم که تو این DataGridView جستجو می‌کنه. قبل از اینکه یک ستون را مخفی‌ کنم کاملا درست کار میکرد اما زمانی‌ که یک ستون را مخفی‌ می‌کنم تابع در یکی‌ از کد‌ها یک error میگیره این کد و error هست
Object reference not set to an instance of an object.

Dim i As Integer = dgv.CurrentRow.Index + 1
با تشکر

anooshiran
جمعه 06 شهریور 1388, 23:25 عصر
سلام

من این کد را استفاده کردم و کاملا درست کار می‌کنه، ممنون و متشکر اما یه مشکله جدید برخود کردم. من یک تابع دارم که تو این DataGridView جستجو می‌کنه. قبل از اینکه یک ستون را مخفی‌ کنم کاملا درست کار میکرد اما زمانی‌ که یک ستون را مخفی‌ می‌کنم تابع در یکی‌ از کد‌ها یک error میگیره این کد و error هست
Object reference not set to an instance of an object.

Dim i As Integer = dgv.CurrentRow.Index + 1
با تشکر

سلام دوست عزیز
اگر ممکنه کد های تابعی راکه در این گرید جستجو میکنه را آپلود کن

scream666_ss
سه شنبه 10 شهریور 1388, 06:11 صبح
اگر ممکنه کد های تابعی راکه در این گرید جستجو میکنه را آپلود کن
سلام
این کد تابع من هست
باز هم دست شما درد نکند و متشکرم.

یک سوال دیگه هم داشتم آیا می‌شه لیست ستونهای مخفی‌ شده را به منو راست کلیک اضافه کرد؟ یعنی‌ هر ستونی که حذف میشه در آن لیست اضافه بشه؟
باز هم تشکر.

Public Shared Function findNextInAll(ByVal str As String, ByVal dgv As DataGridView) As Boolean
Dim i As Integer = dgv.CurrentRow.Index + 1
Dim find As Boolean = False
Dim j As Integer = 0
While i < dgv.Rows.Count - 1
For j = 0 To dgv.ColumnCount - 1
If dgv.Rows.Item(i).Cells(j).Value.ToString.ToUpper.C ontains(str.ToUpper) Then
dgv.CurrentCell = dgv.Rows(i).Cells(j)
find = True
Exit While
End If
Next j
i = i + 1
End While
If Not find Then
If MsgBox("String not found try from the first?", MessageBoxButtons.YesNo, "Not Find") = MsgBoxResult.Yes Then
dgv.CurrentCell = dgv.Rows(0).Cells(0)
CommonFunctions.findNextInAll(str, dgv)
End If
End If
Return find
End Function

f.nabavi
سه شنبه 10 شهریور 1388, 09:28 صبح
سلام. مشکل شما برای این اتفاق میفته که هیچ سطری از dvg انتخاب نشده . در نتیجه current row وجود نداره و برنامه ارور میده. ممکنه بار اول که تابع رو صدا میزنید این مشکل نباشه ولی چون تابع شما خود فراخوانی داره احتمالا در مراحل بالاتر وقتی
CommonFunctions.findNextInAll(str, dgv)
رو اجرا میکنید dvg ارسالی به تابع دیگه current row نداشته باشه.
در مورد سوال دوم. به راحتی میتونی با یه حلقه تمام ستونهای گرید رو بگردی و اونهایی که نمایش داده نشدن رو به منو یا هر لیست که بخوای اضافه کنی. مشکلت دقیقا کجاست؟

scream666_ss
سه شنبه 10 شهریور 1388, 11:53 صبح
سلام ممنون و متشکر سوال اوّلم حق با شما بود البته نه بخاطر تابع بازگشتی بخاطر اینکه بعد از اینکه کاربر یک ستون را مخفی‌ کرد دیگر هیچ ستونی select نیست و همین باعث میشود که تابع درست کار نکند که با قراردادن select در تابع مخفی‌ کنند مشکل را حل کردم

اما سوال دوم این نیست که ستون‌های مخفی‌ را برگردانم اون که به قول شما با یک حلقه حل میشود. می‌خواهم کاری کنم که وقتی‌ که کاربر یک ستون را مخفی‌ می‌کند علاوه بر کلمه مخفی‌ که در منو لیست قرار دارد نام آن ستون هم اضافه شود که بعدا اگر کاربر روی نام ستون کلیک کرد ستون به نمایش در بیاید. درواقع راهی‌ برای برگرداندن یکی‌ یکی‌ می‌خواهم

باز هم ممنون و متشکر

f.nabavi
سه شنبه 10 شهریور 1388, 12:41 عصر
منم منظورم این نبود که با حلقه ستون های مخفی رو برگردونی. منظورم این بود که داخل منو بریزی. مثلا اگر cmenu یک Contexmenu باشه با کد زیر میتونی ستون هایی که تشخیص میدی نامرئی هستن رو بهش اضافه کنی
For i = 0 To grid1.ColumnCount - 1
cmenu.Items.Add(grid1.Columns(i).HeaderText & " become visible")
cmenu.Items(i).Tag = i
Next

که در مثال بالا من همه رو اضافه کردم. و در رویداد ItemClicked منو یه کد مثل زیر بنویسی:

Private Sub cmenu_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs ) Handles cmenu.ItemClicked
grid1.Columns(CInt(e.ClickedItem.Tag)).Visible = True
End Sub
اگر باز اشتباه فهمیدم بگو

scream666_ss
سه شنبه 10 شهریور 1388, 13:37 عصر
سلام

بازهم متشکرم اما دوست عزیز یه نگاه به کد بالا بیاندازید از context menu استفاده نشده بلکه از ContextMenuStrip استفاده شده و یک ToolStripMenuItem به آن اضافه شده که event کلیک شدن در آن به یک تابع ارجاع داده میشود و برای همین پرسیدم که چگونه می‌شه ستون‌ها را یکی‌ یکی‌ در منو اضافه کرد یعنی‌ هربار که یکی‌ حذف می‌شه در منو اضافه بشه اینکار ممکن است اما یه مشکل است و آن اینکه در این حالت چگونه باید فهمید کدام MenuItem کلیک شده؟ نمی‌شود که برای هریک از منو‌ها یک تابع نوشت

f.nabavi
سه شنبه 10 شهریور 1388, 14:29 عصر
من هم منظورم همین ContextMenuStrip هست. رویداد itemclick رو هم برای ContextMenuStrip نوشتم. و چون نمیشه فهمید روی کدوم آیتم کلیک کرده، موقع اضافه کردن آیتم ها مقدار tag اونها رو برابر ایندکس ستون پنهان شده گذاشتم. اگر یه خرده صبر کنی یه نمونه برنامه برات مینویسم

f.nabavi
سه شنبه 10 شهریور 1388, 14:40 عصر
اینم نمونه برنامه. ببین به دردت میخوره...