ورود

View Full Version : سوال: چطور میشه تعداد ردیف‌های انتخاب شده را بدست آورد؟



mmbguide
سه شنبه 28 بهمن 1404, 11:16 صبح
سلام

در یک از فرم Sub-Form استفاده کردم که اطلاعات رو بصورت Datasheet نمایش میده و کاربر میتونه از طریق Navigation Buttons چندین ردیف رو در حالت انتخاب قرار بده. دستور Form.SelTop میشه شماره اولین ردیف رو بدست آورد ولی Form.SelHeight که باید تعداد ردیف‌های انتخاب شده را برگرداند مقدار 0 را برمیگرداند. ویژگی DefaultView مربوط به Sub-Form روی Datasheet تنظیم شده. ممنون میشم اگر راهنمایی کنید که چطور میشه بین ردیف‌های انتخاب شده در DataSheet یک حلقه جهت انجام عملیات اجرا کرد؟ تشکر

eb_1345
سه شنبه 28 بهمن 1404, 15:48 عصر
سلام

در یک از فرم Sub-Form استفاده کردم که اطلاعات رو بصورت Datasheet نمایش میده و کاربر میتونه از طریق Navigation Buttons چندین ردیف رو در حالت انتخاب قرار بده. دستور Form.SelTop میشه شماره اولین ردیف رو بدست آورد ولی Form.SelHeight که باید تعداد ردیف‌های انتخاب شده را برگرداند مقدار 0 را برمیگرداند. ویژگی DefaultView مربوط به Sub-Form روی Datasheet تنظیم شده. ممنون میشم اگر راهنمایی کنید که چطور میشه بین ردیف‌های انتخاب شده در DataSheet یک حلقه جهت انجام عملیات اجرا کرد؟ تشکر
با سلام
کدهای زیر رو در رویداد Form_MouseUp سابفرم درج بفرما و سپس با موس ردیف های مورد نظر رو انتخاب کن تا تعداد ردیف های انتخاب شده در تکست باکس txtSelected فرم اصلی قرار بگیرد


If Me.NewRecord = True Then
Me.Parent.txtSelected.Value = 0
Else
Me.Parent.txtSelected.Value = Me.SelHeight
End If

mazoolagh
چهارشنبه 29 بهمن 1404, 09:12 صبح
سلام و روز خوش
البته این انتخاب رکوردها فقط میتونه پیوسته باشه
و اگر بخواین ناپیوسته انتخاب کنین اکسس پشتیبانی نمیکنه (Ctrl + Click) و باید یک راهکاری واسش پیاده کنین (اضافه کردن یک checkbox)

مورد بعدی این که به محض خروج از sub-form ، اطلاعات رکوردهای انتخاب شده از دست میره،
برای همین باید در main-form متغیری برای نگهداری اونها داشته باشین
که در رویداد exit از کنترل sub-form اونها رو آپدیت کنین - دقت داشته باشین که این رویداد exit در main-form هندل میشه.

mazoolagh
چهارشنبه 29 بهمن 1404, 09:14 صبح
Option Compare Database
Option Explicit

Private Selection_Height As Integer
Private Selection_Top As Integer

Private Sub Btn_GO_Click()
Dim s As String
Dim i As Integer

With Me.Products_Subform.Form.RecordsetClone
.MoveFirst
.Move (Selection_Top - 1)
For i = 1 To Selection_Height
s = s + !ProductName + vbCrLf
.MoveNext
Next
End With
If s = "" Then
MsgBox "Nothing Selected", vbExclamation, ""
Else
MsgBox s, , "Selected Items"
End If
End Sub

Private Sub Products_Subform_Exit(Cancel As Integer)
With Me.Products_Subform.Form
Selection_Height = .SelHeight
Selection_Top = .SelTop
End With
End Sub

mazoolagh
چهارشنبه 29 بهمن 1404, 09:23 صبح
برنامه نمونه

156711

156712

mmbguide
جمعه 01 اسفند 1404, 06:47 صبح
ممنون جناب mazoolagh (https://barnamenevis.org/member.php?9893-mazoolagh) . نکته‌ی جالبی بود.

mmbguide
چهارشنبه 06 اسفند 1404, 12:32 عصر
حالا یک سوال نسبتا مزتبط. گاها برخی کویری‌ها مقدارشون را به عنوان شرط واکشی داده‌ها از یک کنترل روی فرم دریافت میکنند مانند یک Combo. آیا امکان ارسال چند آیتم به عنوان شرط از یک ListBox به یک کوئری وجود دارد؟

mazoolagh
پنج شنبه 07 اسفند 1404, 10:49 صبح
حالا یک سوال نسبتا مزتبط. گاها برخی کویری‌ها مقدارشون را به عنوان شرط واکشی داده‌ها از یک کنترل روی فرم دریافت میکنند مانند یک Combo. آیا امکان ارسال چند آیتم به عنوان شرط از یک ListBox به یک کوئری وجود دارد؟

این به مراتب ساده تر و بهتره (برای چیزی که در نظر دارین)
چون هم لیست باکس خودش یک کالکشن از آیتم های انتخاب شده داره و
هم این که اجازه میده مد multi-select رو خودتون مشخص کنین (با کلیک ساده - یا - با کلیک همراه با شیفت و کنترل برای انتخاب پیوسته و گسسته)

برای دسترسی به کالکشن آیتم های سلکت شده:
DIM listItem
FOR EACH listItem IN ListBox.ItemsSelected
DEBUG.PRINT ListBox.COLUMN(column_index , listItem)
NEXT
خود ItemsSelected یک پراپرتی count هم داره.

البته روش های دیگه هم هست که بشه چند آیتم از یک دسته آیتم انتخاب کرد - ولی همین لیست باکس از همشون ساده تر و بی دردسرتر هست.

mmbguide
دوشنبه 18 اسفند 1404, 10:52 صبح
ممنون جناب mazoolagh .