کنترل در زی فریم
هنگامی که یک فرم در زی فریم ساخته می شود، اگر این فرم بر اساس یک جدول ساخته شده باشد، زی فریم به ازای هر فیلد از جدول یک کنترل به صورت خودکار درون فرم می سازد. اما اگر بر اساس جدول ساخته نشده باشد لازم است تا درون زی فریم کنترل های مورد نیاز تعریف شوند. برای دسترسی به کنترل های تعریف شده درون فرم یا ایجاد یک کنترل جدید می توان به قسمت Control مراجعه نمود. به همین منظور، پس از کلیک بر روی علامت + در کنار فرم و باز کردن فهرست اجزای تشکیل دهنده آن، بر روی اولین گزینه ای که مشاهده می شود (Controls) کلیک نمایید. این گزینه شامل لیست کنترل هایی است که بر اساس جدول انتخابی در زی فریم ساخته شده است؛ به صورت پیش فرض تمامی کنترل ها از جنس Text Box هستند.
بر روی نوار ابزار بالای این فرم گزینه هایی وجود دارد که می توان از آن جهت ذخیره اطلاعات، اضافه و یا حذف یک کنترل به فرم و همچنین جستجو استفاده کرد.
جهت مدیریت کردن هر یک از کنترلها می توان بر روی آن کنترل کلیک راست نموده تا منوی زیر ظاهر شود.
یکی از مهمترین گزینه ها در این منو گزینهControl Type است که در آن 28 نوع کنترل تعبیه شده است. هر یک از این کنترلها به نحو ویژه ای امکان دریافت اطلاعات از کاربر را فراهم می کنند. به عنوان مثال می توان با تعیین نوع کنترل مشخص کرد که کاربر بتواند اطلاعات را به صورت یک متن وارد کند، بتواند اطلاعات را به صورت یک فایل وارد کند، بتواند یک گزینه از بین گزینه های موجود انتخاب کند و یا چند گزینه از بین گزینه های موجود انتخاب کند و ….
با انتخاب هر کدام از گزینه ها نوع کنترل جاری تبدیل به کنترل انتخابی کاربر خواهد شد. در زیر می توان فهرست انواع کنترل های از پیش طراحی شده در زی فریم را مشاهده نمود. لازم به ذکر است که زی فریم محدود به این کنترل ها نبوده و نیست، چرا که توسعه دهنده ای که با کدنویسی آشنا باشد می تواند کنترل های دلخواه خود را ساخته و در پروژه ها استفاده نماید.
ListBox | CheckBoxList | LookupTableBox | Hidden |
DropdownTree | RadioButtonList | FindObjectBox | TextBox |
Chart | Form | GridView | DataCombo |
Menu | DownloadObject | File | CheckBox |
FlatTree | SearchText | Button | Option |
ClientButton | Label | Tree | DateBox |
CustomControl | TextEditor | Image | TextArea |
کنترل Hidden
از این کنترل برای ایجاد یک کنترل پنهان یا Hidden Control در فرم استفاده می¬شود. زمانی که در زی فریم از این کنترل استفاده شود، نوع آن در خروجی HTML نیز Hidden خواهد بود و مقادیر کاربردی (که باید از دید کاربر پنهان باشد) در آن ذخیره و بازیابی می گردد. همچنین برای مدیریت این کنترل می توان آن را با یک کلیک انتخاب نمود تا پنجره Properties در سمت راست ظاهر شود. در این پنجره تمامی خصوصیت های لازم جهت مدیریت و سفارشی سازی کنترل قرار داده شده است.
کنترل TextBox
از این کنترل زمانی استفاده می شود که لازم است کاربر بتواند یک متن در فرم وارد کند. در واقع این کنترل در خروجی از تگ Input استفاده می کند. عملکرد خصوصیت Developer Tag در این کنترل به صورت زیر است.
Developer Tag
یکی از مهمترین کاربردهایی که این خصوصیت دارد تعیین قالب ورودی اطلاعات است. برای مثال زمانی که نیاز به دریافت اطلاعات مربوط به کارت بانکی 16 رقمی با ساختاری مشابه 3320-9999-8888-6050 باشد، برای آن که کاربر زمان درج اطلاعات راحت تر بتواند 16 رقم را وارد کند، از چنین فرمتی برای ورود اطلاعات استفاده می شود.
0000 – 0000 – 0000 – 0000
به عبارت دیگر، زمانی که کاربر مشغول ثبت داده ها است، سیستم چنین فرمتی را برای اطلاعات ورودی در نظر می گیرد. در نتیجه وقتی کاربر 16رقم 6050888899993320 را وارد کند، در صفحه نمایش آن را به صورت 3320-9999-8888-6050 مشاهده خواهد کرد.
کنترل DataCombo
مهم ترین خصوصیت در این کنترل، خصوصیتDataSource است که از آن برای بارگذاری اقلام اطلاعاتی داخل این کنترل استفاده می شود. برای مثال اگر لیست انواع جنسیت مد نظر باشد، باید داخل جدولی با عنوانGender ، اقلام اطلاعاتی مانند آقا و خانم وجود داشته باشد تا مقدار DataSource برابر با چنین عباراتی قرار داده شود.
SELECT Gender_ID, Gender_Title FROM Gender
در نتیجه مقادیر واکشی شده از بانک اطلاعاتی داخل این کنترل نمایش داده می شود.
در کد فوق دو عدد اقلام اطلاعاتی Gender_ID و Gender_Title از جدول واکشی شده است. مقدار اول به عنوان کلید استفاده شده و به کاربر نمایش داده نمی شود، اما مقدار دوم همان اطلاعاتی است که به عنوان خروجی به کاربر نمایش داده می شود.
کنترل CheckBox
از این کنترل زمانی استفاده می شود که لازم است کاربر وضعیت یک مقدار دوگانه را تعیین کند. به عنوان مثال فعال یا غیرفعال بودن، باز یا بسته بودن، تسویه یا عدم تسویه و …
کنترل Option
از این کنترل زمانی استفاده می شود که لازم است کاربر از بین چند گزینه تنها یکی از آنها را انتخاب نماید. به عنوان مثال تعیین جنسیت (خانم یا آقا)، تعیین نقش (دانشجو یا فارغ التحصیل یا استاد) و غیره.
کنترل DateBox
اگر در برنامه برای دریافت اطلاعاتی نظیر تاریخ تولد از کاربر نیاز به نمایش یک تقویم باشد، می توان از کنترل Date Box استفاده نمود. مهمترین خصوصیت این کنترل Developer Tag است و دیگر خصوصیات آن calendar type است.
Calendar Type:
درون خصوصیت Calendar Type این کنترل گزینه های زیر به صورت پیش فرض قرار داده شده است.
با انتخاب هر کدام از گزینه ها می توان مبنای نمایش تاریخ را به قمری، شمسی و میلادی تغییر داد.
کنترل TextArea
زمانی که در برنامه نیاز به کنترلی باشد که در آن کاربر متنی چند خطی (همچون توضیحات، مشروح اخبار و …) را وارد نماید از این کنترل استفاده می شود. تمامی خصوصیات این کنترل همانند کنترلText Box است.
کنترل LookUpTable
این کنترل یکی از کنترل های پیچیده و بسیار کاربردی در زی فریم بوده که در واقع یک کنترل سفارشی شده است. چنانچه توسعه دهنده بخواهد کنترلی ایجاد کند که وقتی کاربر کد ملی یک شخص را وارد کرد، اطلاعات مربوط به نام، نام خانوادگی و … شخص مورد نظر نمایش داده شود، از این کنترل استفاده می شود. خصوصیات این کنترل در تصویر زیر آمده است.
جهت استفاده از کنترل Lookup Table Box ابتدا باید این کنترل به فرم مورد نظر اضافه شود. می توان در همان ابتدا جهت سهولت مشاهده، مقدار خصوصیتCaption را برابر با “اطلاعات شخص” قرار داد. سپس کدی مشابه کد زیر برای دسترسی به داده های مرتبط با نام، نام خانوادگی و کد ملی افراد در قسمتDataSource نوشته می شود. توجه شود که فیلد اول در کد نوشته شده (Person_ID) به عنوان کلید استفاده شده و در خروجی نشان داده نخواهد شد.
SELECT dbo.Person.Person_ID
, dbo.Person.NationalNumber
, dbo.Person.FName
, dbo.Person.Lname
FROM dbo.Person
با این کار کنترل ایجاد شده در خروجی به شکل زیر نمایان می گردد.
همانطور که مشاهده می شود عملکرد این کنترل به این صورت است که اگر کاربر اطلاعات کد ملی را وارد نماید و بر روی دکمه ENTER بزند، اطلاعات مربوط به نام و نام خانوادگی در فیلدهای مربوطه پر خواهد شد. در این کنترل دکمه ای نیز برای هدایت کاربر به یک فرم دیگر جهت انتخاب شخص مورد نظر وجود دارد. این دکمه زمانی کاربرد دارد که فرمی برای این کار ساخته شده باشد. در غیر این صورت خصوصیتی وجود دارد به عنوان Show Find Form که اگر مقدار آن برابر با Disable قرار داده شود، دیگر این دکمه ظاهر نخواهد شد. اما اگر استفاده از یک فرم دیگر مد نظر باشد، باید مقداری برای خصوصیت Related Form در نظر گرفت. برای این کار باید بر روی دکمه Select کلیک شده تا پنجرهAccess Form ظاهر شود.
حال می توان از داخل این پنجره، فرم مورد نظر را برای برقراری ارتباط انتخاب نمود.
کنترل FindObjectBox
این کنترل یکی از کنترل های پرکاربرد است که به کاربر این امکان را می دهد تا به راحتی اطلاعات مورد نظر خود را از میان انبوهی از رکوردها انتخاب نماید. برای مثال اگر در یک سامانه مدیریت انبارها حدود 200 انبار وجود داشته باشد و کاربر بخواهد یک انبار را از میان آنها انتخاب نماید. با وارد کردن یک واژه، سیستم لیستی از تمامی انبارهایی که آن واژه درون اسم آنها به کار رفته است را نمایش می دهد تا کاربر به راحتی از میان آنها انتخاب نماید. برای تعریف این نوع از کنترل، درون خصوصیتDataSource کنترل کدی مشابه کد زیر وارد می شود.
SELECT dbo.Warehouse.Warehouse_ID
, dbo.Warehouse.Warehouse_TitleFROM dbo.Warehouse
با استفاده از این کد به کاربر این اجازه داده می شود تا انبار مورد نظر را بر اساس عنوان انبار انتخاب نماید. هنگامی که کاربر داخل این کنترل واژه ای وارد کند مانند واژه “مرکزی”، لیست تمامی انبارهایی که واژه “مرکزی” در آنها وجود دارد نمایان می شود و کاربر می تواند انبار مورد نظر خود را انتخاب نماید.
در این کنترل نیز همانند کنترل LookupTableBox خصوصیتی با عنوانRelated Form وجود داردکه دقیقا همان کارایی را دارد.
دسته دوم
کنترل GridView
کنترل GridView برای نمایش Grid است که در تصویر زیر یک نمونه از خروجی آن مشاهده می شود.
مقداری که در خصوصیت DataSource (یعنی Query دیتابیسی) برای این کنترل در نظر گرفته می شود توسط برنامه اجرا شده و مقدار خروجی، داخل این کنترل نمایش داده خواهد شد. یکی دیگر از قابلیت های این کنترل آن است که به سادگی می توان در داخل هر فیلد کنترل مورد نظر را نیز قرار داد.
کنترل File
از کنترل File برای ذخیره فایل های بارگذاری شده از سمت کاربر استفاده می شود.
با استفاده از این کنترل می توان فایل های دریافتی از سمت کاربر را در داخل بانک اطلاعاتی و همچنین داخل Application Server به صورت ساختار یافته ذخیره نمود.
روش ذخیره فایل به صورت ساختار یافته در Application Server:
داخل فایل zf.configdata در پروژه اجرایی، خصوصیتی با عنوان filedatabasepath وجود دارد. در صورتی که این خصوصیت مقدار دهی شده باشد، اطلاعات داخل این مسیر ذخیره سازی خواهد شد، در غیر این صورت داخل پوشه FileDataBaseContent اطلاعات ذخیره می گردد.
مدل ذخیره سازی:
پوشه اول همنام با نام فرم ذخیره می شود و داخل این پوشه، پوشه ای دیگر همنام با نام کنترل ساخته خواهد شد (اگر نام فرم مورد نظرUser و نام کنترل برابر با User_Image باشد، یک پوشه با نامUser و درون آن یک پوشه با نامUser_Image ساخته می شود.) هنگام ذخیره کردن اطلاعات، زمانی که کاربر یک فایل را Upload کند، زی فریم داده این کنترل را با مقدار کلید اصلی فرم (اولین کنترل موجود در هر فرم، کلید اصلی آن فرم محسوب می شود) و با پسوند DAT ذخیره می کند. البته این فرایند در صورتی رخ می دهد که توسعه دهنده نحوه ذخیره سازی را در خصوصیت Save In File = Enable انتخاب کرده باشد. در غیر این صورت، اطلاعات با استفاده از کد ذخیره سازی Sql داخل بانک اطلاعاتی ذخیره می شود.
کنترل Button
برای انجام یک پردازش سمت سرور می توان یک دکمه با استفاده از کنترل Button ایجاد نمود. زمانی که بر روی این دکمه کلیک شود رویداد مورد نظر توسعه دهنده (به عنوان مثال ثبت اطلاعات فرم) رخ خواهد داد.
در کنترل Button چند رفتار پرکاربرد درون خصوصیتDefault Behavior به صورت پیشفرض قرار داده شده است. این رفتارها شامل:
1. Navigate برای جابه جایی به یک آدرس استفاده می شود (آدرس مقصد باید درونDeveloper Tag نوشته شود)
2. Save عملی مشابه دکمه “ذخیره سازی” در نوار ابزار انجام می دهد.
3. New عملی مشابه دکمه “جدید” در نوار ابزار انجام می دهد.
4. Delete عملی مشابه دکمه “حذف” در نوار ابزار انجام می دهد.
5. Print عملی مشابه دکمه “چاپ” در نوار ابزار انجام می دهد.
6. Grid Object To Excel برای گرفتن خروجی اکسل استفاده می شود. این گزینه عملی مشابه دکمه “Excel Report” در نوار ابزار انجام می دهد.
7. Custom Excel Report برای گرفتن خروجی اکسل استفاده می شود. این گزینه عملی مشابه دکمه “Excel Report” در نوار ابزار انجام می دهد.
کنترل Tree
این کنترل برای نمایش ساختار درختی در پروژه به کار می رود. زمانی که توسعه دهنده بخواهد داده ای را به صورت سلسله مراتبی به کاربر نمایش دهد، از این کنترل استفاده خواهد کرد. تنها با نوشتن یک کد ساده، زی فریم اطلاعات را به صورت مطلوب در اختیار کاربر قرار داده و کاربر می تواند گزینه مورد نظر خود را انتخاب نماید. برای واکشی اطلاعات از بانک اطلاعاتی و نمایش آنها داخل کنترل مورد نظر، کد SQL زیر داخل خصوصیتDataSource کنترل نوشته می شود.
SELECT DBO.TreeStructure.ID
, DBO.TreeStructure.Parent_ID
, DBO.TreeStructure.ProvinceCity
FROM DBO.TreeStructure
جدولی که در دیتابیس ساخته می شود نیز باید ساختار درختی داشته باشد تا بتوان از آن در کنترل Tree استفاده نمود. به عنوان مثال ساختار درختی جدول استانها و شهرهای ایران به شکل زیر است.
• فیلد اول کلید جدول است.
• فیلد دوم باید کد والد باشد.
• فیلد سوم مقدار نام های قابل نمایش است.
• هیچ کدام از مقادیر اول و دوم نبایدNULL باشد.
نمایی از خروجی کنترل در تصویر زیر نمایش داده شده است.
کنترل Image
برای نمایش تصویر در خروجی (به عنوان مثال نمایش عکس پرسنل یا نمایش تصاویر بارگذاری شده توسط کاربر) از کنترل Image استفاده می شود. تصویر مورد نظر می تواند بر اساس یک محتوای ذخیره شده داخل بانک اطلاعاتی باشد، یا مربوط به یک داده ذخیره شده داخل فرمی دیگر و یا داخل همین فرم جاری باشد.
در این کنترل دو خصوصیت مهم وجود دارد:
• Reference Form
• Reference Field
اگر اطلاعات در همین فرم جاری ذخیره گردد دیگر نیازی به مقداردهی به خصوصیت Reference Form نیست. اما امکان دارد در پروژه ای یک فرم برای ثبت اطلاعات کاربر (Reference Form) و یک فرم برای نمایش اطلاعات ایجاد شده باشد و تصویر نمایش داده شده در فرم دوم از فرم اول (Reference Form) استخراج شود. داده یا فایل مورد نظر داخل یک کنترل در فرم اول ذخیره می گردد که به آن Reference Field گفته می شود. این کنترل باید از نوع کنترل File باشد.
کنترل CheckBoxList
با استفاده از این کنترل می توان مجموعهای از چک باکس ها (Check Box) را به کاربر نشان داد تا بر اساس انتخاب کاربر اطلاعات مورد نظر در بانک اطلاعاتی ذخیره شود.
نحوه عملکرد
برای نمونه فرض شود که توسعه دهنده می خواهد در یک فرم مربوط به تعریف کاربر، لیست گروه های کاری نمایش داده شود تا بتوان برای کاربر مورد نظر مشخص نمود که به کدام یک از گروه های کاری دسترسی داشته باشد.
کنترل Checkbox list با کنترل کلیدی فرم در ارتباط است. به طور استاندارد اولین کنترل موجود در فرم کنترل کلید بوده که از جنس Hidden است. در فرم جاری یک کنترل کلید با نام SYS_USER_ID ساخته می شود.
SYS_USER_ID در Query های مربوط به این کنترل با شاخص KEY@ قابل دسترسی است.
در مرحله اول سامانه با استفاده از کوئری درج شده در خصوصیت Query DataSource کلیه مقادیری که باید نمایش دهد را واکشی می کند. در مرحله دوم مقادیری که انتخاب شده اند را واکشی کرده و تیک می زند. در مرحله سوم هنگام ذخیره اطلاعات، Query Delete بر اساس کلید فرم اجرا می شود. در مرحله چهارم مقادیری که کاربر درون فرم تیک زده است در بانک اطلاعاتی ذخیره می گردد.

در واقع این کنترل نیاز به چهار Query دارد
DataSource Query
این Query، مقادیر اصلی که باید بارگذاری شوند را واکشی میکند (یعنی تمامی گزینه ها برای نمایش)
SELECT SYS_USERGROUP_ID,USERGROUPNAME
FROM BUSINESS_DESK_MD.DBO.SYS_USERGROUP
Fill Queryبا این Query مقادیری که انتخاب شده اند، واکشی شده و checkbox مربوط به آن تیک می خورد.
SELECT SYS_USERGROUP_ID
FROM BUSINESS_DESK_MD.DBO.SYS_USERGROUPLIST
WHERE SYS_USER_ID =
در این قسمت زی فریم به صورت خودکار بعد از علامت مساوی مقدار کلید را جایگزین کرده و نیازی نیست توسعه دهنده چیزی بعد از مساوی درج نماید.Update Query
با این Query اطلاعات مربوط به موارد انتخاب شده در سیستم ذخیره می شود.
INSERT INTO BUSINESS_DESK_MD.DBO.SYS_USERGROUPLIST
(SYS_USER_ID , SYS_USERGROUP_ID)
VALUES
( @KEY , @ID )
با اجرای کد فوق، سیستم فقط اطلاعاتی که تیک خورده را انتخاب کرده و در جدول ثبت می نماید.Delete Query
با این Query تمامی موارد مربوط به کلید جاری حذف می شود.
DELETE FROM BUSINESS_DESK_MD.DBO.SYS_USERGROUPLIST
WHERE SYS_USER_ID =
دسته سوم
کنترل RadioButtonList
این کنترل همانند کنترلCheckbox List است، با این تفاوتکه خصوصیات Query Delete و Update در آن وجود ندارد. این موضوع به این دلیل است که کاربر فقط می¬تواند یک مقدار را انتخاب کند و آن گزینه توسط Query ذخیره سازی فرم در بانک اطلاعاتی می¬نشیند.
کنترل Form
یکی از مهم ترین قابلیت های زی فریم استفاده از فرم ها به صورت تو در تو (Nested) است. این کنترل زمانی کاربرد دارد که در پروژه یک فرم ساخته شده باشد و کاربر بخواهد از این فرم درون فرم دیگری استفاده کند.
برای مثال در حالتMaster/Detail زمانی که در پروژه یک فرم والد وجود داشته باشد و توسعه دهنده بخواهد داخل این فرم لیستی از اطلاعات دیگر (مانند فرم فاکتور) که مربوط به همین رکورد است را نمایش دهد، از قابلیت کنترل Form استفاده می شود.
فاکتور علاوه بر اطلاعات پایه در Header، می تواند دارای اقلام اطلاعاتی دیگری نیز باشد که با استفاده از کنترل Form می توان این جزئیات اطلاعاتی را به شکل ساختار زیر حذف و اضافه نمود.
برای ساختن چنین فرمی ابتدا باید فرم مقصد و یا فرم زیر مجموعه در سیستم ساخته شده باشد. ساختار فرم زیر مجموعه آورده شده در تصویر بالا به شکل تصویر زیر است.
فرایند مربوط به ذخیره سازی با استفاده از قسمت Action Query صورت می پذیرد (برای دسترسی به Action Query، روی فرم کلیک راست کرده و سومین گزینه “Action Query” انتخاب می شود. در ادامه توضیحات بیشتر داده خواهد شد.) در فرم والد، برای کنترل اطلاعات و دسترسی کد زیر در خصوصیتDataSource ثبت می شود.
SELECT
dbo.Parties_Entities_Access.Parties_Entities_Access_ID,
dbo.Parties_Entities_Access.Parties_Entities_ID
FROM
dbo.Parties_Entities_Access
از طریق خصوصیتRelated Form از بین لیست فرم ها، فرم مورد نظر همانند تصویر زیر انتخاب می شود.
کنترل DownloadObject
این کنترل برای دانلود کردن محتوایی که قبلا در سامانه بارگذاری شده است کاربرد دارد و باید رابطه ای منطقی با موجودیت قابل دانلود در سامانه تعریف شود.
همانگونه که در قسمت کنترل File توضیح داده شد، برای بارگذاری اطلاعات از این کنترل استفاده می شود و در مقابل برای دانلود محتوا باید از کنترلDownloadObject استفاده شود.
در میان خصوصیات این کنترل نیز خصوصیات Reference Form و Reference Field مانند کنترل Image مشاهد می شود که دارای همان ساختار بوده و به منظور اجرای عملیات دانلود، با کلید اصلی فرم نیز در ارتباط هستند.
اما در این کنترل، خصوصیت متفاوتی با عنوانDefault File Type مشاهده می شود که با استفاده از آن می توان نوع فایل قابل دانلود را تعریف نمود. همانطور که در تصویر مشاهده می شود، مقدار این خصوصیت برابر با pdf قرار داده شده است تا با کلیک بر روی لینک دانلود، تنها فایلهای با پسوندPDF قابل قابل دانلود باشد.
کنترل SearchText
این کنترل دقیقا همانند کنترل FindObjectBox عمل می کند، با این تفاوت که دکمه ای برای پیداکردن فرم مرجع در کنار Textbox خروجی وجود ندارد (خروجی فقط یکTextBox است که با تایپ کردن بخشی از گزینه مورد نظر، تمام گزینه هایی که آن عبارت در آنها وجود دارد پیشنهاد می شود.)
زمانی که توسعه دهنده بخواهد یک متن و یا داده را به کاربر نمایش دهد، بدون آنکه کاربر بتواند آن داده را تغییر دهد از کنترل Label استفاده می شود. خصوصیات این کنترل دقیقا همانند کنترل Textbox است.
زمانی که در یک پروژه نیاز به یک کنترل با توانایی ویرایش متن باشد، می توان از این کنترل استفاده نمود. خصوصیات این کنترل همانند Text Aria و Textbox است.

از این کنترل برای نمایش یک لیست استفاده می شود. به منظور استفاده و نمایش اطلاعات باید خصوصیت DataSource این کنترل مقدار دهی شود. در تصویر زیر نمونه ای از خروجی کنترلListbox مشاهده می شود.

این کنترل همانند کنترل Treeview است با این تفاوت که ابتدا یک دراپ داون نمایش داده شده تا پس از باز کردن آن توسط کاربر، لیست اقلام اطلاعاتی به صورت ساختار درختی مشاهده شود.

این کنترل برای نمایش اطلاعات با فرمت نمودار استفاده می شود.
این کنترل با توجه به مقداری که در DataSource نوشته شود، ساختار منو می سازد که با استفاده از کدهای جاوا اسکریپت می توان آن را مدیریت نمود.
این کنترل همانند دیگر کنترل های Treeview عمل می کند، با این تفاوت که تمامی اطلاعات داخل یک باکس نمایش داده می شود.
این کنترل تنها برای انجام دادن کار و یا یک فرایند در سمت کلاینت قابل استفاده است. برای این منظور باید کدهای جاوا اسکریپت مربوطه برای این کنترل نوشته شود. این کنترل از کنترل های بسیار پرکاربرد بوده که از کاربردهای آن می توان به فراخوانی سرویس ها و مدیریت برخی رویدادها در سمت کلاینت اشاره نمود.
در زی فریم قابلیتی وجود دارد که به توسعه دهندگان این امکان را می دهد تا کنترل مورد نیاز برای کسب و کار و پروژه خود را ایجاد کنند. برای ایجاد اینگونه کنترل های سفارشی نیاز است تا توسعه دهنده مجهز به دانش برنامه نویسی با زبان برنامه نویسی جاوا باشد.
نمایش کنترل در نوار ابزار
کاربرد
هر فرمی از نوع Grid Form که در زی فریم ساخته می شود، خروجی آن در مرورگر دارای یک نوار ابزار (Toolbox) با تعدادی دکمه خواهد بود. هر کدام از این دکمه ها دارای قابلیتی است که به کاربر برای مدیریت آسان اطلاعات فرم و پیمایش میان آنها کمک می کند. از این دکمه ها می توان برای ایجاد یک رکود جدید، ویرایش و یا حذف رکوردهای موجود، پرینت، پیمایش بین صفحات و … استفاده نمود. اما وجود همه این دکمه ها برای تمامی فرمها الزاما ضرورتی ندارد؛ به همین دلیل در بسیاری از موارد، توسعه دهنده خود تصمیم به غیرفعال کردن بعضی از آنها می گیرد. برای آشنایی با نحوه فعال و یا غیرفعال سازی دکمه های موجود در نوار ابزار به آموزش آشنایی با Button Rule در زی فریم مراجعه کنید.
اما قابلیت های این نوار ابزار محدود به دکمه های از پیش طراحی شده آن نیست. در زی فریم شما می توانید کنترل های دلخواه خود را ساخته و آنها را به عنوان یک دکمه درون نوار ابزار قرار دهید تا بدین صورت، نوار ابزار فرم مورد نظر را به شکل دلخواه طراحی کنید.
افزودن کنترل به نوار ابزار
برای اضافه نمودن یک کنترل در قسمت نوار ابزار ابتدا از داخل فرم، کنترل مورد نظر را انتخاب کرده و در پنجره Properties مقدار خصوصیت Add In Toolbox را برابر با Enable قرار دهید. در تصویر زیر یک کنترل از جنس Text Box که برای دریافت کدملی از مخاطب ساخته شده است را به نوار ابزار انتقال خواهیم داد.
سپس با استفاده از دکمه Save تغییرات را در فرم ذخیره کرده و Clear Cache کنید.
همانطور که مشاهده می شود یک Text Box در قسمت نوار ابزار اضافه شده است. توجه کنید که در ابتدا هیچ مقداری درون این Text Box مشاهده نمی شود زیرا هنوز هیچ یک از ردیف های اطلاعاتی موجود (رکورد) در Grid انتخاب نشده است. به محض آنکه یک رکورد انتخاب شود، مقدار عددی کد ملی موجود در آن رکورد درون Text Box نوار ابزار نمایش داده خواهد شد.
مشاهده خواهید کرد که با انتخاب سطرهای مختلف، کد ملی مربوط به همان رکود درون Text Box نمایش داده می شود.
خصوصیات کنترل
مقدمه
پس از تعیین نوع کنترل می توان خصوصیات آن را نیز مدیریت نمود. به همین منظور باید ابتدا کنترل مورد نظر را انتخاب نمود تا در قسمت سمت راست IDE پنجره مربوط به خصوصیات(Properties) فعال شود. سپس می توان به مدیریت و تغییر خصوصیت های آن کنترل پرداخت. در زی فریم نه تنها تعدادی خصوصیت مشترک برای کنترل ها وجود دارد، بلکه برای هر کنترل خصوصیات مختص به آن نیز طراحی شده است.
همچنین می توان از مسیر زیر همانطور که در تصویر نمایش داده شده است، جعبه ابزار انتخاب کنترل جهت قرار دادن درون یک فرم را (در منوی Design از طریق مسیر زیر) مشاهده کرد.
Design >> Toolbox
انواع دسته بندی
زمانی که یک کنترل انتخاب شود، خصوصیات آن در سمت راست صفحه نمایان خواهد شد. این خصوصیات به پنج دسته کلی زیر تقسیم می شوند:
1)متنی و رشته ای،
2)عددی،
3)کوئری،
4)فرم
5)مقادیر از پیش تعریف شده،
6) لیستی
نمونه هایی از این پنج دسته در ادامه آورده شده است.
نمونه یک خصوصیت با مقدار متنی و رشته ای
نمونه یک خصوصیت با مقدار عددی
نمونه یک خصوصیت با مقدار Query
در خصوصیات هایی از جنس کوئری زمانی که بر روی دکمهQuery Editor کلیک شود پنجره زیر باز شده و می توان کد مورد نظر برای این خصوصیت را درج نمود.
نمونه یک خصوصیت با مقدار فرم (برای قرار دادن یک فرم دیگر درون فرم جاری)
در خصوصیت از جنس فرم که در تصویر بالا مشاهده می شود، زمانی که بر روی دکمهselect کلیک شود فرم زیر نمایان خواهد شد.
در این پنجره لیست تمامی فرم های موجود در سامانه مشاهده می شود تا کاربر بتواند فرم مورد نظر را انتخاب کند.
نمونه یک خصوصیت با مقادیر از پیش تعریف شده و لیستی
تصویر فوق نمونه ای از خصوصیت از جنس لیست است که کاربر می تواند مقادیر پیش فرض را از داخل لیست انتخاب نماید.
خصوصیات اجباری
زمانی که یک کنترل انتخاب شود پنجره مربوط به خصوصیات آن کنترل نمایان می گردد. خصوصیاتی که با رنگ نارنجی مشخص شده اند، خصوصیات اجباری بوده و حتما باید مقداردهی شوند تا کنترل مورد نظر به درستی عمل کند.
انواع خصوصیات
Name
این خصوصیت مشخص کننده نام کنترل است که از آن در کدنویسی برای اشاره به یک کنترل استفاده می شود. این خصیصه یک خصوصیت عمومی بوده و در تمامی کنترل ها وجود دارد.
مقدار وارد شده برای خصوصیت Name حتما باید با الفبای لاتین نوشته شده باشد.
Active
از این خصوصیت برای فعال یا غیرفعال کردن کنترل استفاده می شود. در صورتی که مقدار آن برابر Disable قرار گیرد، آنگاه این کنترل در نرم افزار خروجی قابل مشاهده نخواهد بود. این خصوصیت در تمامی کنترل ها موجود است.
Caption
این خصوصیت در دیکشنری داخلی زی فریم کاربرد بسیاری دارد. همان طور که پیشتر اشاره شد، خصوصیت Name برای اشاره به یک کنترل در کدنویسی بک اند استفاده می شود. همچنین نام این کنترل در خروجی نیز به طور پیش فرض همین نام خواهد بود. چنانچه توسعه دهنده بخواهد کاربر نهایی، این کنترل را با نام دیگری مشاهده کند، نام دلخواه خود را در قسمت Caption وارد می کند. برای مثال فرض کنید کنترلی با Name: Duration_ID تعریف شده است. چنانچه برای این کنترل در قسمت Caption مقدار “کد دوره” ثبت شود، دیگر برای این کنترل در سامانه در تمامی خروجی ها (مانند تیتر ستون ها در Grid) و عنوان های نمایشی از چنین واژه ای استفاده می شود. به عبارت دیگر، کاربر نهایی به جای مشاهده Duration_ID واژه “کد دوره” را مشاهده خواهد کرد. این خصوصیت در تمامی کنترل ها موجود است.
Database Column
اگر فرم براساس یک جدول و یا یک View ساخته شده باشد، هر یک از کنترل ها به یکی از فیلدهای جدول متصل خواهد بود. این خصوصیت نمایانگر نام فیلدی است که این کنترل بر اساس آن ساخته شده و به آن متصل است. در نتیجه هنگام واکشی اطلاعات، سیستم برای پر کردن این کنترل از ستونی از جدول دیتابیس استفاده می کند که همنام با فیلد Database Column باشد. متعاقبا هنگام وارد کردن اطلاعات در این کنترل نیز سیستم این اطلاعات را در ستون همنام با فیلد Database Column ذخیره می کند. این خصوصیت در تمام کنترل های موجود است.
DataSource
محتوای داخل این خصوصیت می تواند یک کدSQL برای بارگذاری محتوای داخل کنترل بوده و یا حتی می تواند خالی باشد از این خصوصیت در بعضی کنترل ها بسیار کاربرد دارد. برای آشنایی بیشتر با نحوه عملکرد آن به آموزش کنترل DataCombo مراجعه شود.
Cache Keyword
در زی فریم قابلیتی وجود دارد که با استفاده از آن می توان در سمت Application Server اطلاعات را Cache نمود تا برای دسترسی به اطلاعات نیازی به بارگذاری مجدد از سمت بانک اطلاعاتی نباشد. این خصوصیت به توسعه دهنده کمک می کند تا کلیدی را برای ذخیره سازی و بازیابی چنین خصوصیاتی در نرم افزار تعریف کند.
Default Value
فهرست مقادیر موجود در این خصوصیت در تصویر زیر آورده شده است.
در برخی مواقع وقتی یک فرم در حالت ثبت اطلاعات جدید است، نیاز خواهد بود که مقدار یک فیلد به صورت خودکار پر شود. این خصوصیت این امکان را به توسعه دهنده می دهد تا مقادیری همچون تاریخ و ساعت را به صورت خودکار به یک کنترل اختصاص دهد. مقادیر پیش فرض در نظر گرفته شده شامل موارد زیر است.
System Date | اطلاعات داخل کنترل را برابر با تاریخ جاری پر می کند. |
System Time | اطلاعات داخل کنترل را برابر با ساعت جاری پر می کند. |
Calculator | زمانی که توسعه دهنده بخواهد محاسباتی را برای یک کنترل انجام دهد از این گزینه استفاده خواهد کرد. روال محاسباتی داخلDataSource اجرا می شود. |
Session Value | در برخی مواقع نیاز است تا مقادیری که درSession ذخیره شده است در فرم جاری بارگذاری شود (برای مثال نام و نام خانوادگی کاربر جاری). وقتی که از این مقدار برای حالت پیش فرض استفاده شود، مقدار موجود درSession Value که در Data source نوشته شده است در داخل فیلد مورد نظر جایگذاری می شود. |
Developer Tag
برای هر کنترل این مقدار کار خاصی را انجام می دهد.
Sequence Number
مقدار این خصوصیت یک عدد است که بر مبنای آن، اولویت و جایگاه شماره ای کنترل در فرم مشخص می شود. به عنوان مثال، اگر مقدار Sequence Number برابر با 3 باشد، این کنترل سومین کنترل موجود در فرم خواهد بود.
Width
با وارد کردن یک مقدار (به صورت عددی) برای این خصوصیت، نرم افزار خروجی طول این کنترل را به صورت Inline برابر با همین مقدار در نظر خواهد گرفت. مقدار عدد وارد شده براساس معیار اندازه گیریPixel عمل می کند.
Required Text
وقتی پر کردن یک فیلد از سمت کاربر ضروری باشد اما کاربر آن را خالی بگذارد، باید یک پیام خطا به اون نشان داده شود. پیام مورد نظر را می توان درون این خصوصیت وارد نمود تا به کاربر نشان داده شود. برای مثال اگر پر کردن فیلد “نام” از سوی کاربر ضروری باشد، می توان درون این خصوصیت جمله ” کاربر گرامی وارد کردن اطلاعات مربوط به نام شما در سیستم اجباری است.” را نوشت تا هنگام خطا به او نشان داده شود.
Regular Expression
با مقدار دهی به این خصوصیت می توان درستی ساختار اطلاعات ورودی از سمت کاربر را بررسی نمود. برای مثال اگر بررسی صحت اطلاعات شماره تماس دریافتی از سمت کاربر مد نظر باشد تا کاربر نتواند هر نوع داده ای را در سیستم ثبت کند، می توان از رشته زیر درون خصوصیت Regular Expression استفاده کرد. ” ^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$” توجه داشته باشید که نیازی به حفظ کردن این رشته و دیگر رشته های Regular Expression نیست، زیرا انواع مدل هایRegular Expression در اینترنت موجود بوده و می¬توان صرفا آنها را کپی و پیست نمود.
CSS Class
این خصوصیت همانند CssClass در فرم است و چنین خصوصیتی برای تمامی کنترل ها به جز کنترل Hidden وجود دارد. از این خصوصیت برای دریافت کلاس گرافیکی (ظاهر نمایش کنترل به کاربر) استفاده می شود.
Validator Css Class
ظاهر گرافیکی پیامی که در هنگام استفاده از Required Text و Regular Expression به کاربر ارائه می شود را نیز می توان با استفاده از کدهای CSS طراحی نمود. برای این منظور می توان از خصوصیت Validator CSS Class استفاده کرد.
Read Only
زمانی که مقدار این خصوصیت Enable باشد، کاربران در سامانه خروجی دیگر نمی¬توانند محتوای داخل کنترل را تغییر دهند.
Disable
در حالتی که مقدار این خصوصیت برابر باEnable باشد، کنترل مورد نظرDisable می شود و هیچ گونه فعالیتی بر روی آن انجام¬پذیر نخواهد بود. این خصوصیت در کنترل هایی مانندButton کاربرد بیشتری دارد، زیرا در کنترل Textbox حالت Read-only و Disable شباهت بسیار زیادی به هم دارند.
Tooltip Text
هنگامی که توسعه دهنده نشانگر ماوس را بر روی یک کنترل نگه دارد، متنی حاوی توضیحات و راهنما ظاهر می¬شود که به آن Tooltip گویند. برای قرار دادن و یا تغییر این متن می توان از خصوصیت Tooltip Text استفاده کرد تا به عنوان یک راهنما، توسعه دهنده را در هنگام استفاده از زی فریم یاری رساند.
Hidden Control چیست؟
کنترل های پنهان (Hidden Control) کنترلهایی هستند که از دید کاربران پنهان است. این نوع از کنترل ها در وبسایت ها و اپلیکیشن های مختلف کاربرد های بسیاری دارند. به این صورت که امروزه مدیریت بسیاری از کارهایی که در این وبسایت ها و اپلیکیشن ها انجام داده می شود با استفاده از کنترل های پنهان صورت می گیرد. به عبارت دیگر، این کنترل ها از نگاه کاربران سایت پنهان هستند اما می توان درون این کنترل ها مقادیری را ذخیره و در جایی دیگر از آنها استفاده کرد. به عنوان مثال برای ذخیره اطلاعات Session کاربران می توان از کنترلهای پنهان استفاده نمود. برای آشنایی با مفهوم Session به آموزش Session مراجعه کنید.
در زی فریم تمامی فرم ها به حداقل یک کنترل پنهان نیاز دارند تا زی فریم بتواند محتویات این فرم ها و روابط میان آنها را مدیریت کند. معمولا اولین ستون از جدول یا اولین کنترل فرم به عنوان کنترل پنهان در نظر گرفته می شود.
خصوصیات Hidden Control
Name: این قسمت مربوط به نام ذخیره شده کنترل است.
Active: با استفاده از این خصوصیت می توان وضعیت کنترل را مشخص کرد. برای کنترل های پنهان تفاوتی در مقدار این خصوصیت وجود ندارد اما در کنترل های دیگر اگر مقدار این خصوصیت برابر با Disable باشد، آنگاه این کنترل در صفحه وبسایت نمایش داده نمی شود. عدم نمایش این کنترل در صفحه نمایش به معنای حذف آن نیست بلکه این کنترل تنها غیرفعال شده است.
Caption: برای اختصاص دادن یک نام یا عنوان به یک کنترل در صفحه نمایش از خصوصت Caption استفاده می شود. مقدار این خصوصیت در کنترل های پنهان اهمیتی ندارد زیرا این کنترل ها در فرم به کاربر نمایش داده نمی شوند.
با توجه به قابلیت چندزبانه بودن نرم افزارهای تولید شده توسط زی فریم، می توان مقدار این خصوصیت را به زبان های دیگر نیز ترجمه کرد تا نام کنترل ها به زبان های دیگر به کاربران نمایش داده شود.
DataBase Column: اگر فرم توسط یک جدول در دیتابیس ساخته شده باشد و کنترل مورد نظر مربوط به یک فیلد در جدول دیتابیس باشد، آنگاه مقدار این خصوصیت با نام فیلد در دیتابیس برابر خواهد بود. به عبارت دیگر، این کنترل به آن فیلد متصل است.
Data Source: با استفاده از این خصوصیت می توان یک کوئری برای کنترل نوشت تا این کوئری درون دیتابیس اجرا شود و عملیاتی خاصی انجام گیرد. مقدار این خصوصیت با توجه به نوع و همچنین کاربرد کنترل در فرم می تواند متفاوت باشد.
Default Value: با استفاده از این خصوصیت میتوان مقداری پیش فرض برای کنترل در نظر گرفت.
این خصوصیت زمانی فعال است و اجرا می شود که فرم در حالت وارد کردن اطلاعات جدید (روی حالت New) باشد.
این خصوصیت دارای شش مقدار است:
1- None: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرضی برای این کنترل، در نظر گرفته نخواهد شد.
اگر فرم بر اساس یک جدول دیتابیس ساخته شده باشد (New Form By Table) آنگاه بهتر است مقدار این خصوصیت در کنترل پنهان برابر با None باشد. زیرا در این روش اولین فیلد جدول دیتابیس (که کلید اصلی جدول است) به صورت خودکار به عنوان یک کنترل پنهان تعریف خواهد شد و مقادیر آن نیز به صورت Auto Increment وارد می شوند. برای آشنایی با ساخت جدول و ویزگی Auto Increment به آموزش ساخت جدول در SQL Server مراجعه نمایید.
2- System Date: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرض این کنترل، برابر با تاریخ سیستم کاربر خواهد شد.
3- System Time: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرض این کنترل، برابر با ساعت سیستم کاربر خواهد شد.
4- Calculator: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرض این کنترل، با توجه به کد وارد شده در قسمت Data Source تعیین خواهد شد. برای مثال اگر در این قسمت کد زیر را وارد کنید، در خروجی کنترل مورد نظر مقدار 12 نمایش داده خواهد شد.

5- Session Value: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرض این کنترل، برابر با یک مقدار از Session خواهد شد که این مقدار را در خصوصیت Tag/Format تعریف خواهیم کرد. برای مثال اگر خصوصیت Tag/Format برابر با USER_ID و مقدار Default Value برابر با Session Value باشد، مقدار پیش فرض کنترل برابر با آیدی Session کاربر خواهد شد. برای آشنایی بیشتر با مفاهیم و کاربردهای Session به مقاله آشنایی با Session مراجعه شود.
6- GUID: اگر مقدار Default Value برابر با این مقدار باشد آنگاه مقدار پیش فرض این کنترل، برابر با یک GUID خواهد شد. برای آشنایی بیشتر با GUID مقاله آشنایی با GUID را مطالعه شود.
Developer Tag: با استفاده از این خصوصیت می توان یک ساختار مشخص برای کنترل فرم خود تعریف نمود. برای مثال اگر مقدار این خصوصیت برابر با 00 باشد، آنگاه کاربر در این فیلد تنها می تواند عددی حداکثر با دو رقم وارد کند.
Sequence Number: مقدار این خصوصیت نشان دهنده جایگاه قرار گیری کنترل در فرم است. برای مثال، مقدار این خصوصیت برای اولین کنترل موجود در فرم برابر با 1، برای دومین کنترل برابر با 2 و غیره است.
آشنایی با TreeView Control
از این کنترل برای نمایش ساختار درختی در پروژه ها استفاده می شود. به عبارتی زمانی که توسعه دهنده بخواهد دادها را برای کاربر به صورت سلسله مراتبی نمایش دهد، می تواند از این کنترل استفاده نماید. تنها با نوشتن یک کد ساده، زی فریم اطلاعات را به صورت مطلوب در اختیار کاربر قرار داده و کاربر می تواند گزینه مورد نظر خود را انتخاب نماید. همچنین جدولی که در دیتابیس ساخته می شود نیز باید ساختار درختی داشته باشد تا بتوان از آن در کنترل Treeاستفاده نمود. مانند تصویر ذیل که بسیار پر کاربرد است و برای اطلاعات شهرستان ها و استان ها می باشد:
در این تصویر فیلد اول برابر با والد اصلی است که در آن Parent_ID برابر با صفر در نظر گرفته می شود و در نتیجه والدی ندارد. می تواند یک جدول چند والد اصلی داشته باشد. اما در این جدول تنها یک والد اصلی در نظر گرفته شده است که همان کشور ایران است. سپس نوبت فرزندان تراز اول می رسد که اسامی استان ها بوده و شامل فیلدهای 2 و 7 و 11 می باشند. هر کدام از این فیلدها هم برای خود فرزندانی را دارند. نتیجه جدول فوق، چیزی شبیه به درختواره ذیل خواهد شد:
ایجاد جدول مرتبط در پایگاه داده
می توان در اکثر پایگاه های داده، موجودیت ها را به دو دسته تعاریف پایه و موجودیت های اصلی تقسیم بندی نمود. تعاریف پایه شامل مواردی شناخته شده و ثابت می باشند. مواردی مانند ایام هفته، روزهای ماه و سال، جنسیت، ماه های سال، انواع حقوق و دستمزد، انواع استخدام و غیره. به این تعاریف پایه، کدهای شرحی هم گفته می شود. برای ساخت جدول مرتبط با این تعاریف پایه، مانند تصویر ذیل یک جدول با فیلدهای BaseData_ID به عنوان کلید اصلی، Parent_ID به عنوان ID والد، Title یا عنوان و IS_Active برای مشخص کردن فعال بودن یا نبودن رکوردها تعریف می شود. در نهایت هم یک نام مانند BaseData برای جدول انتخاب شده و ذخیره می شود.
ایجاد فرم مرتبط در زی فریم
پس از اینکه جدول مرتبط در پایگاه داده ساخته شد، لازم است که با توجه به آموزش های مقدماتی، یک فرم برای آن ساخت شود. در این فرم برای کل جدول یک caption به نام اطلاعات پایه در نظر گرفته می شود. همچنین برای فیلدها هم به ترتیب caption های والد، عنوان و فعال در نظر گرفته می شوند. در ادامه می بایست که با توجه به محتوای فیلدها، نوع کنترل آنها تعریف شوند. برای این کار در ابتدا نوع کنترل والد را به نوع DateCombo عوض می کنیم. در کادر باز شده برای انتخاب جدول هم اینبار خود جدول BaseData را انتخاب می کنیم. دلیل این کار هم ایجاد یک ساختار درختی است که در آن کلیدهای خارجی به فیلدهای دیگری در خود همین جدول ارجاع داده می شوند. با این ساختار که برای فیلدهایی که دیگر والدی را نخواهند داشت و به عبارتی بالاترین والد محصوب می شوند، Parent_ID برابر با صفر در نظر گرفته می شوند. فرزاندان دست اول هم هرکدام Parent_ID برابر با ID یکی از والدین تراز اول را خواهند داشت. برای فرزندان دست دوم همParent_ID برابر با ID یکی از فرزاندان دست اول خواهند بود. به همین ترتیب این ساختار می تواند ادامه داشته باشد.

در نتیجه تا این مرحله از کار، فرم ذیل حاصل می شود. حال می بایست این فرم به یک ورک فلو متصل شود. بهتر این است که یک ورک فلو برای اطلاعات پایه و تعاریف ثابت اختصاص داده شود و کلیه مواردی از این قبیل در آن تعریف گردند.
برای این کار و با توجه به آموزش های پیشین، از طریق منوی Workflow بر روی گزینه Workflow management کلیک می کنیم. سپس در آنجا این فرم را به گردش کار مرتبط با تعاریف ثابت اختصاص می دهیم. فرض کنیم که می خواهیم این فرم در ابتدای جداول نمایش داده شود. در نتیجه می بایست به باقی فرم ها در آن گردش کار، یک view index با شماره بالا اختصاص داده شود. مانند مثال ذیل:
با اختصاص دادن شماره هایی بالاتر از یک به سایر فرم ها، نتیجه چیزی شبیه به تصویر ذیل خواهد شد:
حال می بایست کدهای مرتبط با ثبت، ویرایش و حذف داده در فرم مذکور، اعمال شوند. برای حل این منظور به قسمت Action Query وارد شده و در آنجا بر روی دکمه Write All Query کلیک می کنیم. همچنین کدهای بخش insert را مطابق شکل زیر تغییر می دهیم.
همچنین کدهای بخش update را هم مطابق شکل ذیل تغییر می دهیم.
در هر دو مورد از یک ساختار شرطی استفاده شده است. به این مفهوم که اگر فیلد PARENT_ID خالی نبود، خود PARENT_ID را قرار بده. در غیر این صورت صفر در نظر گرفته می شود (چنانچه شرط فوق به درستی عمل نکرد از شرط ISNULL( convert ( numeric(18) , @INTPARENT_ID ) ,0 ) استفاده کنید) عدد صفر در این مثال به عنوان رکورد پایه در نظر گرفته شده که همه رکوردهای فرزندان دست اول زیر مجموعه آن قرار می گیرند. به همین دلیل می بایست برای این فرزندان، رکورد 0 به صورت دستی در پایگاه داده درج گردد.
در نهایت تغییرات ذخیره می شود. برای تکمیل کار هم کافیست تا با کلیک بر روی دکمه Application Cache Management و بعد از آن کلیک بر روی دکمه Clear Cache Data تغییرات را در مرورگر اعمال کنید. پس از آنکه به مرورگر مراجعه کردید، متوجه می شوید که رکورد اطلاعات پایه وجود دارد. حال می بایست از این رکورد، ساختار درختی شکل بگیرد. پس اولین رکوردی که ثبت می شود، یکی از رکوردهای مرتبط با فرزندان دست اول است. به عنوان مثال فصول سال. در نتیجه مطابق شکل ذیل آن رکورد ایجاد می گردد:
حال می بایست فرزندان این رکورد هم تعریف شوند. پس مشابه با شکل ذیل، برای فرزندان فصول سال، والد فصول سال قرار داده می شود:
همین روند برای سایر فصول سال انجام می شود. همچنین به عنوان فرزاندان دست دوم، ماه های هر فصل هم آورده می شوند. بنابر این مانند تصویر ذیل ماه های سال هم وارد جدول می شوند. در اینجا والد همان فصول سال می باشند:
در ادامه می توان حتی به عنوان فرزندان دست اول، مواردی بیشتر را هم تعریف نمود. در نهایت جدول از رکوردهایی متعدد و طبق همین اصول تکمیل می گردد. برای نمایش این ساختار می توان از کنترل tree استفاده نمود. به همین منظور، کنترل tree را به فرم اضافه کرده و برای آن یک نام و caption در نظر می گیریم. نتیجه کار می تواند چیزی شبیه به تصویر ذیل باشد:
همانگونه که در تصویر بالا دیده می شود، فیلد اجباری DataSourceوجود دارد که می بایست پر شود. در این قسمت تنها جدولی که انتخاب می شود، خود جدول BaseData بوده و از این جدول هم سه فیلد اولش انتخاب می شوند. چرا که می بایست در انتخاب فیلدها برای طراحی query یک ساختار درختی، اولین فیلد، فیلد کلید اصلی جدول و دومین فیلد هم فیلد PARENT_ID جدول باشد. همچنین نباید هیچکدام از مقادیر PARENT_ID های تعریف شده در query مقدار null داشته باشند. اگر هم در جدولی این مورد مشاهده شد ، می بایست که در آن تمامی PARENT_ID های null تبدیل به صفر شوند. در غیر اینصورت، ساختار درختی مدنظر ایجاد نخواهد شد.
در نهایت بر روی دکمه OK کلیک می شود. برای تکمیل کار هم کافیست تا با کلیک بر روی دکمه Application Cache Management و بعد از آن کلیک بر روی دکمه Clear Cache Data تغییرات را در برنامه اعمال کنید. حال اگر به مرورگر مراجعه شود، نتیجه چیزی شبیه به تصویر ذیل خواهد بود.
می توان همین روال را برای یکی دیگر از کنترل های مرتبط با ساختار درختی اعمال نمود. نام این کنترل Drop Down Tree View است که نتیجه کار را به صورت یک درخت درون یک Drop Down نمایش می دهد. همچنین دارای یک scroll جهت پیمایش درختواره است.
در رابطه با ساخت درختواره علاوه بر دو مورد بالا، یک ساختار دیگر هم به نام Flat Tree View وجود دارد. در این ساختار یک scroll جهت پیمایش درختواره قرار داده شده است. ولی برخلاف Drop Down Tree View فاقد Drop Down می باشد. در شکل ذیل، خروجی مرتبط با این کنترل هم نمایش داده شده است:
بهتر است که هر کدام از اطلاعات پایه در جداول مختلفی ذخیره گردند. چرا که اگر همه آنها را در یک جدول بیاوریم، ممکن است در روند پشتیبانی از نرم افزار به مشکلاتی برخورد کنیم که این مشکلات، کار پشتیبانی را پیچیده تر می کنند. دلیل آوردن کل اطلاعات پایه در اینجا و درون یک جدول هم فقط ایجاد یک مثال از ساختار درختی بود.
ویرایش والد بدون کدنویسی
می توان با اعمال تغییرات و سفارشی سازی برنامه در سطوح مختلف، تغییراتی را در این کنترل ایجاد کرد که برای کاربر نهایی مطلوب تر باشد و واسط کاربری زیباتر و یا تجربه کاربری متفاوتی را برای آنها ایجاد کند. یکی از این موارد، مثال ذیل است که توسط توسعه دهندگان زی فریم ایجاد شده است. در این ساختار، ویرایش والد توسط خود کاربر نهایی به سادگی و با یک کلیک راست امکان پذیر می شود. چرا که کاربر نهایی دانش برنامه نویسی با زی فریم را نداشته و درکی از ساختار کنترل Tree View ندارد. اما کاربر با وجود چنین افزونه ای و بدون دانش برنامه نویسی زی فریم، می تواند ساختار درختی خود را در هر زمان تغییر دهد و براحتی جابجایی بین ساختار را داشته باشد.
کنترل CheckBoxList
گاهی نیاز است تا گزینه های موجود در یک فرم به صورت یک Check Box List نمایش داده شود. به عنوان مثال فرمی با عنوان “گروه های کاری” داریم که وظیفه این فرم تعریف سطح دسترسی کاربران سیستم است. همچنین فرم دیگری با عنوان “کاربران سیستم” وجود خواهد داشت که وظیفه این فرم تعریف کاربران سیستم و تعیین میزان سطح دسترسی آنها است.
حال فرض کنید می خواهیم گروه های کاری تعریف شده در فرم “گروه های کاری” به صورت Check Box در فرم “کاربران سیستم” نمایش داده شوند و با فعال یا غیر فعال بودن آنها متوجه شویم که کدام یک از کاربران عضو کدام یک از گروه های کاری هستند.
برای انجام این کار نیاز است تا در فرم “کاربران سیستم” یک کنترل از نوع Check Box List ایجاد کرده و پس از آن تنظیمات و کد های مربوط به کوئری های آن را وارد کنید.
خصوصیات کنترل چک باکس لیست
کنترل Check Box List دارای چهار خصوصیت اصلی و مهم شامل Data Source، Fill Query، Delete Query و Update Query است که تکمیل نمودن آنها برای کارکرد صحیح این کنترل ضروری می باشد.
Data Source
خصوصیت Data Source اولین خصوصیت اصلی کنترل Check Box List است، که با توجه به کوئری وارد شده در قسمت Query Editor، اقلام اطلاعاتی مورد نیاز را از یک جدول در دیتابیس خوانده و هرکدام از رکورد های آن را به صورت Check Box نمایش می دهد.
برای کارکرد صحیح این خصوصیت نیاز است تا یک کوئری از نوع Select در قسمت Query Editor نوشته شود.
نحوه صحیح وارد نمودن کوئری در Query Editor برای خصوصیت “Data Source”:
SELECT Table_Name.Column_Name
FROM Table_name
توجه داشته باشید که در این کوئری باید کلید اصلی (ID) رکورد و همچنین عنوان آن انتخاب شود.
در این مثال می توان از کد زیر در قسمت Query Editor خصوصیت “Data Source” استفاده نمود:
SELECT UserGroupList.UserGroup_ID,
UserGroupList.UserGroupName
FROM UserGroupList
Fill Query
دومین خصوصیت اصلی این کنترل، Fill Query است که با توجه به کوئری وارد شده در قسمت Query Editor، فعال یا غیر فعال بودن Check Box را تعیین می نماید.
برای کارکرد صحیح این خصوصیت نیاز است تا یک کوئری از نوع Select نوشته شود. نحوه صحیح وارد نمودن کوئری Query Editor برای خصوصیت “Fil Query” را می توان در کد زیر مشاهده نمود.
SELECT Column_Name[Primary_Key]
FROM Table_name
WHERE ID =
همچنین در این مثال می توان از کد زیر برای Query Editor خصوصیت “Fill Query” استفاده نمود:
SELECT UserGroupID
FROM UserGroupList
WHERE UserID =
Delete Query
قبل از اجرای دستورات Update Query، کدهای خصوصیت Delete Query اجرا خواهد شد. با این کار یکبار داده های موجود در دیتابیس حذف شده و پس از آن با توجه به وضعیت چک باکس های موجود در فرم و با استفاده از خصوصیت Update Query، آخرین وضعیت چک باکس ها در دیتابیس و در جدول مربوطه ثبت می شود. برای کارکرد صحیح این خصوصیت نیاز است تا یک کوئری از نوع Delete نوشته شود.
نحوه صحیح وارد نمودن کد Query Editor برای خصوصیت “Delete Query” :
DELETE
FROM Table_name
WHERE ID =
همچنین در این مثال میتوان از کد زیر برای Query Editor خصوصیت “Delete Query” استفاده نمود:
DELETE
FROM UserGroupList
WHERE UserID =
Update Query
پس از آن که اطلاعات وضعیت چک باکس های فرم در جدول دیتابیس توسط خصوصیت Delete Query حذف شد، نوبت به اجرای خصوصیت Update Query می رسد. با این کار، اطلاعات چک باکس های فرم با توجه به وضعیت فعال و یا عدم فعال بودن آنها وارد دیتابیس می شود. برای کارکرد صحیح این خصوصیت نیاز است تا یک کوئری از نوع Insert نوشته شود.
نحوه صحیح وارد نمودن کد Query Editor برای خصوصیت “Update Query” :
INSERT INTO Table_name
(Column1 , Column2 , …)
VALUES
(@KEY , @ID)
همچنین در این مثال می توان از کد زیر برای Query Editor در خصوصیت “Update Query” استفاده نمود:
INSERT INTO UserGroupList
(UserID , UserGroupID)
VALUES
(@KEY , @ID)
توجه داشته باشید در این کوئری منظور از (KEY@) کلید خود فرم و منظور از (ID@) هم شناسه (Value) هر یک از چک باکس ها است.
به غیر از این چهار خصوصیت اصلی، کنترل چک باکس لیست خصوصیات دیگری نیز دارد که به غیر از خصوصیت Columns Mode، دیگر خصوصیتهای آن با کنترل های دیگر مشترک است.
خصوصیت Columns Mode
با استفاده از این خصوصیت می توان تعداد چک باکس های موجود در هر ردیف را مدیریت کرد. به عنوان مثال اگر 6 عدد چک باکس داشته باشیم و مقدار این خصوصیت را برابر با 3 قرار دهیم، در هر ردیف سه عدد چک باکس قرار خواهد گرفت و پس از آن به ردیف بعد خواهد رفت تا تمام چک باکس ها در صفحه قرار گیرند.
همچنین در خصوصیت Columns Mode برای دسترسی و مدیریت آسان تر چک باکس ها (هنگامی که تعداد زیادی از آنها در برنامه وجود دارد)، ویژگی دیگری در نظر گرفته شده است که با استفاده از آن می توان لیست پیشرفته ای از چک باکس ها ایجاد نمود. برای استفاده از این ویژگی کافیست مقدار خصوصیت Columns Mode را برابر با “1-” قرار داد تا نحوه نمایش آنها مانند تصویر زیر تغییر نماید.
همان طور که در تصویر فوق مشخص است، این ویژگی علاوه بر آن که تمامی چک باکس ها را به صورت کرکره ای یا دراپ داون (Drop Down) نمایش می دهد، امکان جستجو، فعال سازی و غیر فعال سازی تمام چک باکس ها (به صورت همزمان) را نیز در اختیار کاربر قرار می دهد.
کنترل فایل
گاهی لازم است کاربر فایلی را در یک فرم برای توسعه دهنده نرم افزار ارسال کند. به عنوان مثال می خواهیم کاربر در فرم “کاربران سامانه” یک عکس پرسنلی از خود برای توسعه دهنده بارگذاری کند. به منظور انجام این کار، می توان از کنترل “File” استفاده کرد.
نکته قابل توجه آن است که علاوه بر فایل های تصویری می توان فایل های متنی، صوتی، ویدیوئی و غیره را نیز توسط این کنترل از کاربران دریافت نمود.
نحوه ساخت کنترل File
برای ایجاد کنترل آپلود فایل (File Upload)، ابتدا از زیر منوی فرم مورد نظر وارد پنجره Control شوید.
پس از آن در پنجره کنترلهای فرم مورد نظر راست کلیک کرده و ماوس را بر روی گزینه New نگه داشته (هاور کنید) تا لیستی از کنترل ها نمایش داده شود. سپس کنترل “File” را از لیست نمایش داده شده انتخاب کنید، تا این کنترل به فرم اضافه شود.
حال برای تعیین یک عنوان برای این کنترل، از قسمت properties، خصوصیت “Caption” آن را برابر با “عکس پرسنلی” قرار می دهیم.
اکنون با مراجعه به خروجی برنامه در مرورگر خواهید دید که کنترل آپلود فایل (همچون تصویر زیر) به فرم شما اضافه شده است.
توجه نمایید که برای نمایش تصویر آپلود شده در فرم می توان از کنترل Image استفاده نمود.
ایجاد کنترل Image
گاهی نیاز است تا در یک فرم تصویری به کاربر نمایش داده شود. به عنوان مثال فرض کنید یک کنترل از نوع آپلود برای آپلود عکس پرسنلی کاربر درون فرم وجود دارد و نیاز است تا عکسی که کاربر آپلود کرده است، در همان فرم نمایش داده شود. برای انجام این کار کافیست یک کنترل از نوع Image ایجاد کرده و محل ذخیره عکس را به آن معرفی نمود.
خصوصیات کنترل Image
در کنترل “Image” خصوصیاتی وجود دارد که این خصوصیت ها به کارکرد صحیح این کنترل کمک خواهند کرد.
Relation_Control_ID
یکی از خصوصیت های مهم این کنترل، خصوصیت “Relation_Control_ID” است که با استفاده از این خصوصیت می توان آدرس منبع عکس مورد نظر را برای کنترل Image مشخص نمود. به عنوان مثال فرض کنید کاربر یک عکس را با استفاده از کنترل آپلود در یک فرم بارگذاری کرده است و نیاز است تا این عکس در همان فرم به کاربر نمایش داده شود. برای انجام این کار مقدار این خصوصیت را برابر با نام کنترل فایل آپلود (که در این مثال نام آن “NewFile” است) قرار خواهیم داد.
Width و Height
بعد از خصوصیت “Relation_Control_ID”، دو خصوصیت مهم دیگر برای نمایش تصویر کاربر وجود دارد. این دو خصوصیت، خصوصیت های “Width” و “Height” هستند که با استفاده از این دو خصوصیت می توان طول و عرض (بر حسب پیکسل) عکس را تعیین نمود.
نکته
توجه داشته باشید تا زمانی که این دو خصوصیت را تغییر نداده باشید (یا مقدار آنها برابر با 0 باشد)، تصویر نمایش داده نخواهد شد.
همچنین می توان با استفاده از خصوصیت “Caption” یک عنوان مناسب برای این کنترل تعیین نمود (در این مثال عنوان “تصویر کاربر” برای این کنترل در نظر گرفته شده است).
پس از انجام این تنظیمات، یک بار Clear Cache کنید. حال با مراجعه مجدد به خروجی نرم افزار در مرورگر، مشاهده خواهید کرد که تصویر آپلود شده توسط کاربر در فرم نمایش داده شده است.
Related Control
کنترل های مرتبط (Related Control) در زی فریم به کنترل هایی گفته می شود که وابسته به یک کنترل دیگر عمل می کنند.
فرض کنید می خواهیم با استفاده از زی فریم یک سیستم فروشگاهی بسازیم که اگر کاربر نام فروشگاه را انتخاب کرده باشد، فقط کالا های موجود آن فروشگاه به کاربر نمایش داده شود.
در اینجا دو نمونه از نمایش کنترل های مرتبط (Related Control)را به شما نمایش داده ایم:
در این مثال نام فروشگاه یک کنترل از نوع کمبو (combo data) است که اگر نام فروشگاه را ال جی انتخاب کنید، در قسمت نام کالا فقط کالا های مربوط به فروشگاه ال جی نمایش داده میشود.
در ابتدا یک دیتابیس بسازید.(نام این دیتابیس را Store و یا هر نام دلخواه دیگری که میخواهید قرار دهید.)
(برای یادگیری نحوه ی ساخت دیتابیس در MSSQL به آموزش ساخت دیتابیس در MSSQL مراجعه کنید.)
در دیتابیس جدول های مورد نیاز خود را بسازید.
(برای یادگیری نحوه ی ساخت جدول در MSSQL به آموزش ساخت جدول در MSSQL مراجعه کنید.)
در این مثال به 3 جدول برای ذخیره نام فروشگاه ها، ذخیره کالاها و ذخیره سفارشات نیاز داریم. بنابراین سه جدول با نامهای store ، item و request (و یا هر نام دلخواه دیگری)به شکل زیر تعریف می کنیم.
جدول store
جدول item
جدول request
وارد نرم افزار زی فریم شوید.
یک اپلیکیشن جدید با دیتابیسی که ساخته اید تعریف کنید.
(برای یادگیری نحوه ی ساخت اپلیکیشن در زی فریم به آموزش ساخت اپلیکیشن در زی فریم مراجعه کنید.)
بر اساس هر یک از جدول هایی که ساخته شده است یک فرم بسازید.
(برای یادگیری نحوه ی ساخت فرم بر اساس جدول در زی فریم به آموزش ساخت فرم بر اساس جدول در زی فریم مراجعه کنید.)
فرم های خود را در پنجره Forms می توانید مشاهده کنید.
همان طور که مشاهده می کنید سه فرم frmitem ، frmstore و frmrequest توسط زی فریم ایجاد شد.

اکنون نوبت به سفارشی سازی فرم هایی که ساخته اید رسیده است.
فرم frmstore
سفارشی سازی کنترل store_name :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (نام فروشگاه) قرار داده ایم.

در نهایت فرم frmstore ما به این شکل است.

فرم frmitem
سفارشی سازی کنترل store_id :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (نام فروشگاه) قرار داده ایم.
برای آنکه برای انتخاب نام فروشگاه لیستی از نام فروشگاه های تعریف شده داشته باشید، مقدار Control type این کنترل را برابر با data combo قرار دهید.
سپس در قسمت Data Sourse از جدول store ، فیلدهای Store_id و سپس store_name را اضافه کنید.

سفارشی سازی کنترل item_name :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (نام کالا) قرار داده ایم.
سفارشی سازی کنترل item_price :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (قیمت کالا) قرار داده ایم.
در نهایت فرم frmitemما به این شکل است.

فرم frmrequest
سفارشی سازی کنترل store_id :
در این کنترل همانند کنترل store_id در فرم frmitem عمل می کنیم.
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (نام فروشگاه) قرار داده ایم.
برای آنکه همانند فرم frmitem برای انتخاب نام فروشگاه لیستی از نام فروشگاه های تعریف شده داشته باشید، مقدار Control type این کنترل را برابر با data combo قرار دهید.
و از قسمت Data Sourse از جدول store ، فیلدهای Store_id و سپس store_name را اضافه کنید.

ساخت Related Control
فرض کنید میخواهیم کنترل item_id را به یک related control تغییر دهیم. حال بدین منظور مراحل زیر را انجام دهید:
سفارشی سازی کنترل item_id :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (نام کالا) قرار داده ایم.
برای آنکه آیتم های پیشنهادی با توجه به نام فروشگاه نمایش داده شوند،Control type این کنترل را برابر با FindObjectBox قرار دهید.
در قسمت Data Sourse از جدول item ، فیلدهای item_id و سپس item_name را اضافه می کنیم.
در قسمت related condition query از جدول item ، فیلدهای item_id و سپس item_name را اضافه کرده و سپس کد زیر را در ادامه ی قسمت query اضافه کنید.
در این مثال
WHERE dbo.item.item_name LIKE @STRCODE AND store_id = @lngstore_id
dbo.item.item_name همان فیلدی است که می خواهیم به ما نمایش داده شود.
store_id نام کنترل combo data در فرم frmitem است.
در @lngstore_id ، نیز store_id نام کنترل مرتبط در همین فرم است .
در قسمت related control نام کنترل مرتبط یعنی store_id را وارد کنید.
در قسمت related form یک فرم جدید توسط دکمه (New Form By Design) بسازید. ما در این مثال فرمی به نام frmview item ساخته ایم.
برای یادگیری نحوه ی ساخت فرم بدون جدول در زی فریم به آموزش ساخت فرم بدون جدول در زی فریم مراجعه کنید.
در قسمت Form Data Source فرم، تمام فیلد های جدول item را اضافه می کنیم.
در قسمت Grid Data Source فرم از جدول item، فیلدهای item_id و item_name را اضافه کنید و پس از آن کد زیر را در ادامه قسمت query قرار دهید.
WHERE store_id = @lngZPPA1

سفارشی سازی کنترل Count :
Caption این کنترل را تغییر دهید، در این مثال مقدار آن را برابر با (تعداد) قرار داده ایم.
در نهایت فرم ما به این شکل خواهد بود.

در قسمت Workflow Management فرم های خود را وارد کنید.
برای نمایش یک خروجی در سایت، فرم های خود را با داده های دلخواه پر کنید.
لیست کالا های ما به شکل زیر است.

حال اگر وارد فرم request شوید و فروشگاه را ال جی انتخاب کنید زمانی که تلویزیون را در قسمت نام کالا بنویسید، لیست تلویزیون های فروشگاه ال جی را به شما نمایش می دهد.

ولی اگر اسنک را در این قسمت بنویسید به دلیل آنکه در فروشگاه ال جی کالایی با نام اسنک وجود ندارد، هیچ اسمی به کاربر نمایش نمی دهد.

اما اکنون اگر نام فروشگاه رو به چیتوز تغییر دهید، تمام اسنک های این فروشگاه نمایش داده می شوند.

تمامی مراحل یاد شده را می توان به طور خلاصه در تصویر زیر مشاهده نمود.