Farsi Library - FAQ

Tags: FarsiLibrary

A lot of people keep asking me to provide a VB.NET Sample on how to use Farsi Library component. The library is written in C# after all and no sample code is provided to demonstrate VB.NET usage. This post is not a tutorial to Farsi Library per se. I'm answering some of the question regarding VB.NET usage, and some common questions about Farsi Library you've kept asking.

Yet, there are still some people don't know how to create an explicit Main method in VB.NET, so if this post is a low-level for you professionals, just skip this post ;)

Q : I'm using VB.NET but there's no main method to set my thread's culture!

A : Since everything supposed to be easier in VB.NET, you normally do not create an entry point for an application written in VB.NET, but only select a form which is the startup form of your application. To have more control on application initializations, you need to write the application entry method as well. Simply add a new Module (e.g. Named Program) and add a method to initialize and run the main form :

Public Module Program
<STAThread()> _
Public Sub Main()
    Application.SetCompatibleTextRenderingDefault(True)
    Application.EnableVisualStyles()
    Application.Run(New MainForm())
End Sub
End Module

To actually use this Main method, open the Project's properties by double-clicking on "My Project" in solution explorer and in the Application Tab, uncheck the check box that reads "Enable Application Framework" and set your startup object as "Sub Main".

Now when running your application, the main form is created through the Main method in Program class. You can set a breakpoint to check if it is working. Easily add any additional initialization logic to the Main method. To set the running thread's Culture use this code :

Imports System.Threading
Imports System.Globalization

Public Class Program
<STAThread()> _
Public Shared Sub Main()
    Thread.CurrentThread.CurrentUICulture = New CultureInfo("fa-ir")
    Thread.CurrentThread.CurrentCulture = New CultureInfo("fa-ir")

    Application.Run(New MainForm())
End Sub
End Class

Q : I'm running a form with Farsi Library controls. All the dates are in Gregorian calendar.

A : You need to set the running thread's culture information to "fa-ir" culture to see the Persian Calendar information. For Arabic calendar, use "ar-sa" culture.

Q : I've downloaded the source files but it won't compile. When compiling the sources VS.NET says the license key is missing.

A : Farsi Library is an open source project. There's no such thing as license key in this project. To be able to use the compiled dll in certain scenarios (Putting them in GAC, etc.) you need to specify a key which VS.NET uses to sign the built assemblies. If you get the latest version of the source code, the key file is included.

Q : How can I use the Farsi Library on a Web Site or Web Project?

A : I was going to provide an ASP.NET Server control in one of the first releases, but since my web project was canceled, there's no ASP.NET control available. However, you can use the FarsiLibrary.Utils project to convert dates on a web project.

Q : I have downloaded the binary files. What should I do with them? How can I use the controls?

A : First, put the dll files somewhere near your solution / project (e.g. in a Lib folder). Then, you should add controls to VS.NET Toolbox. To do this, open the Toolbox window, right-click and select "Choose Items..." from the menu. On the next dialog, select "Browse..." button and select the "FarsiLibrary.Win.dll" file (or "FarsiLibrary.WPF" if you're working on a WPF project). All the controls will be added to your toolbox. You can simply drag-and-drop them on your form.

Q : I'm working on an application that uses a Database to store dates. On the UI I need to display dates in Persian Calendar. What should I do?

A : Since you only need to "display" the dates in Persian Calendar, you can use DateTime data type on your entities as well as in your database designs. On the front-end, you can use FarsiLibrary controls which will bind to Business Entities, or DataSets, to display the DateTime value in Persian Calendar. You don't need to (and you're strongly advised not to!) use string data type (or other types) to support dates in Persian or other Calendars.

Q : What type of look and feel does the control support?

A : Controls support System Theme (Windows XP, Vista, etc.) plus Office 2000, Office 2003, and partial Office 2007 themes. You can set each control's theme using Theme property, or use the global theme manager :

FAThemeManager.Theme = ThemeTypes.Office2007

Q : How do I change the strings used in controls? How can I localize the strings?

A : Create a class and inherit from one of the available Localizer classes in FarsiLibrary.Resources namespace. Override GetLocalizedString method and provide a suitable representation for StringIDs you want. Later set the instance of your localizer on FALocalizeManager :

Public Class ESLocalizer
Inherits ENLocalizer

Public Overrides Function GetLocalizedString(ByVal id As Resources.StringID) As String
    Select Case id
        Case StringID.Validation_NullText
            Return "<Ningun fecha esta seleccionada>"
        Case StringID.FAMonthView_None
            Return "Nada"
        Case StringID.FAMonthView_Today
            Return "¡Hoy!"
    End Select

    Return MyBase.GetLocalizedString(id)
End Function
End Class

FALocalizeManager.Instance.CustomLocalizer = New ESLocalizer()

Q : I want to use the controls in another calendar. Can I use other cultures (e.g. "es-ES" culture) when using these controls?

A : To globally change the culture set an instance of your culture on CustomCulture property of FALocalizeManager :

FALocalizeManager.Instance.CustomCulture = New CultureInfo("es-ES")

Q : How can I do validation to check if a selected date is correct? How do I restrict the selection to a specific date range?

A : Use the SelectedDateTimeChanging event and set the e.Cancel to true. You can also set an error message on e.Message :

Private Sub faDatePicker_SelectedDateTimeChanging(ByVal sender As System.Object, ByVal e As FarsiLibrary.Win.Events.SelectedDateTimeChangingEventArgs) Handles faDatePicker2.SelectedDateTimeChanging
Dim pd As PersianDate = e.NewValue

If pd.Day <> 20 And Not faDatePicker2.IsNull Then
   e.Message = "Invalid date. Default Date is applied."
   e.NewValue = New DateTime(2010, 1, 20, 0, 0, 0)
End If
End Sub

Q : How can I custom draw a certain day in calendar? How can I draw the holidays in red?

A : You need to plug-in your drawing logic on DrawCurrentDay event. You have access to Day / Month / Year values as well as Graphics object. A Rectange representing date bounds is also available. Remember to set the IsHandled to true if you want to override the base class drawing logic :

Private Sub faMonthView_DrawCurrentDay(ByVal sender As System.Object, ByVal e As FarsiLibrary.Win.Events.CustomDrawDayEventArgs) Handles faMonthView.DrawCurrentDay
If e.Date.DayOfWeek = DayOfWeek.Friday Then
    Dim br1 As New SolidBrush(Color.Wheat)
    Dim br2 As New LinearGradientBrush(e.Rectangle, Color.PaleVioletRed, Color.DarkRed, 45, True)
    Dim fnt As New Font("Tahoma", 8, FontStyle.Bold)
    Dim fmt As New StringFormat
    Dim dayNo As String = e.Day

    fmt.Alignment = StringAlignment.Center
    fmt.LineAlignment = StringAlignment.Center

    e.Graphics.FillRectangle(br2, e.Rectangle)
    e.Graphics.DrawString(dayNo, fnt, br1, e.Rectangle, fmt)

    br1.Dispose()
    br2.Dispose()
    fnt.Dispose()
    fmt.Dispose()

    e.Handled = True
End If
End Sub

Q : How do I convert dates from / to PersianCalendar to / from Gregorian Calendar?

A : You can convert instances of DateTime directly to PersianDate values, which represents their equivalance in PersianCalendar :

Dim pd As PersianDate = CType(DateTime.Now, PersianDate)
lblCastTo.Text = pd.ToString("G")

Dim dt As DateTime = CType(PersianDate.Now, DateTime)
lblCastFrom.Text = dt.ToString("G")

If you're using PersianCultureInfo (which uses standard .NET Framework Persian Calendar), you have access to all standard DateTime formattings as well. See MSDN page for standard and custom date formattings.

Q : I need to do calculations in Persian Calendar. I need to add / remove days to / from specific day in the Persian Calendar.

A : You can use the PersianCalendar class provided in .NET Framework to do so. There's an internal implementation of PersianCalendar in FarsiLibrary.Utils namespace which originally was historically developed before PersianCalendar appearing in .NET 2 :

Dim calendar As New PersianCalendar()
Dim pd = New PersianDate(calendar.AddYears(DateTime.Now, 10))
lblMessage.Text = pd.ToString()
lblToWritten.Text = pd.ToWritten()

You can download VB.NET code related to this FAQ from here.

23 Comments

  • HEskandari said

    I made a simple code to save end-user selection into DB, and also i wanna show current date(as a default date ofcourse).<br /><br />But when i reclaim SelectedDate as <br />mw.SelectedDateTime = DateTime.Now.Date;<br /><br />an event occurs and it assumes that end-user selected a new date ! <br /><br />How can i prevent it ?!

  • HEskandari said

    CustomDrawDayEventArgs dosen't have e.Date.DayOfWeek or such a thing in version RC2 or NightBuild.<br />Please help

  • Farhad Nikkhah said

    با سلام
    ممنون از به اشتراك گزاشتن اطلاعات
    با آرزوي پيشرفت هر چه بيشتر در كليه امور

    فرهاد

  • Hadi Eskandari said

    سلام
    با تشکر از لطف شما دوست عزیز ، متاسفانه چون از این کنترل دیگر استفاده نمیکردم و هیچ کس هم تا بحال از آن استفاده نکرده بود ، درنسخه های جدیدتر اون رو حذف کردم! اگر از ورژن WPF استفاده میکنید ، پیاده سازی اون خیلی ساده و راحت است اگر کمکی خواستید بفرمائید.

  • Abbas Zolfaghari said

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

    این کنترل امکان دیدن تاریخ میلادی و شمسی رو با زدن کلید کانورت باتن که داخل خود کنترل تعبیه کرده بودید می داد (عالی بود) و هیچ مشکلی نداشت تا اینکه برنامه رو توی ویندوز 7 سون که نصب کردیم تاریخ رو در لود اولیه فرم درست ست نمی کرد (یعنی 1/1/1 می گذاشت) و یک ایراد کوچولوی دیگه هم داشت که وقتی کانورت باتن رو می زدیم تمامی کنترل های هم نوع دیگه برنامه هم کالچرشون مثل این کنترل میشد که به هر حال کار می کرد.

    حالا آیا در کنترل های جدید(نسخه جدید) این امکان(تبدیل آنلاین تاریخ میلادی و شمسی به یکدیگر) وجود دارد یا اینکه بوده و من پیدایش نکردم یا روش کار عوض شده است.
    لطفاً من را راهنمایی بفرمایید.
    پیشاپیش از وقتی که می گذارید ممنونم

  • negin said

    با سلام و با تشکر از زحمات شما

    من هم مانند دوست دیگرمان در استفاده از این کنترل در ویندوز 7 مشکل دارم. تاريخ روز را وقتی به selectedDateTime نسبت میدهیم، 1/01/01 میدهد. متوجه جواب نشدم. اگر ممکن است راهنمایی کنید.

    با تشکر

  • Hamed said

    ba salam va tashakkor
    component shoma ta be hal gereh haye ziadi ro az kar haye man baz karde
    vali chand bug moshahede shode baraye man ro vazife doonestam ke be ettela beresoonam
    moteassfeane in bug ha dar noskheye 2.5 ham raf nashode bood

    1) be tore pishfaz component dar halate miladi gharar migirad
    rahe halli ke man estefade mikonam :

    FAMonthView tmp = new FAMonthView();
    tmp.DefaultCalendar = tmp.PersianCalendar;
    tmp.DefaultCulture = tmp.PersianCulture;
    faDatePicker1.SelectedDateTime = DateTime.Now;

    2) dar componente datetimepicker shoma ayyame hafte ba yek rooz ekhtelaf namayesh dade mishavand. vaghti comboye tarikh ra baz mikonim, dar taghvime namayesh dade shode ayyame hafte dorost namayesh dade nemishavand baraye in bug natoonestam rahe halli eraye konam

    ba tashakkor

  • Saeed said

    Salam, inke tashakor beshe ya tamjid beshe az zahamatetoon tanha karie ke az daste man va amsale man bar myad, khaste nabashid.

    yeki az doostane kharejie man ye Barname ba C# neveshte ke kheily allaghe mand bood betoone az taqvime shamsi estefade kone, az man khast ke search konam o manam shoma ro didam, aya in emkan hast ke ishoon betoone routini ro too barnamash bezare ke barnamash Taqvime Shamsi ro ham Support kone?

    Pishapish az rahnamaei va Lotfetoon mamnoonam

  • kalaee said

    <div id="commentbody-1968">
    <p>
    سلام<br />
    چطوری از FADatePicker در ASP.NET میشه استفاده کرد؟<br />
    نمونه کدی که نوشتم اینه:<br />
    protected void Page_Load(object sender, EventArgs e)<br />
    {<br />
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(&ldquo;fa-IR&rdquo;);<br />
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;<br />
    FarsiLibrary.Win.Controls.FADatePicker fd = new FADatePicker();</p>
    <p>
    Page.Form.Controls.Add(fd);</p>
    <p>
    }<br />
    این خطا رو می ده:<br />
    cannot convert from &lsquo;FarsiLibrary.Win.Controls.FADatePicker&rsquo; to &lsquo;System.Web.UI.Control&rsquo;</p>
    <p>
    لطفا راهنمایی کنید<br />
    با تشکر</p>
    </div>

  • Saeed Moh. said

    سلام
    واقعا نمی دانم چطور از به اشتراک گذاشتن کدهاتون تشکر کنم که حق مطلب رو ادا کرده باشم
    FADatePickerConverter اين کنترل بسیار کاربردی و خوب بود. امیدوارم در نسخه های بعدی اضافه کنيد
    بلکه افرادی مانند شما به ما ياد دهند که چگونه کدهایمان را به اشتراک بگذاريم! راستش را بخواهيد از فروش کدهايم شرمسار شدم!!!ا

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

  • Hamed said

    سلام
    با تشكر از كنترل شما. بايد اعتراف كنم چيز به اين خوشدستي و خوبي نديدم
    فقط يك مشكلي كه باهاش برخوردم اينه : اگر تاريخ 28 تا 31 ارديبهشت سال 89 انتخاب بشه، ديگه كنترل فوكوس رو به كس ديگه اي نميده
    لطفا امتحان كنيد و من رو راهنمايي بفرماييد

  • Hadi said

    سلام
    طرز استفاده از این کنترل به این شکل زیاد درست نیست. این کنترل ها تقویم را از Thread اجرایی میگیرند. از مثال زیر استفاده کنید:
    (Applicaiton Startup)
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("fa-ir")

    (Forms):
    FAMonthView mv = new FAMonthView();
    mv.SelectedDateTime = DateTime.Now;

    درباره مورد دوم ، ایا دموی همراه برنامه هم این مشکل را دارد؟

  • Hadi Eskandari said

    از چه نسخه استفاده میکنید؟ از کدام کنترل؟
    در صورت امکان مشکل خود را به آدرس ایمیل من بفرستید

  • mahdi mahdavi said

    با سلام و خسته نباشید .
    اکه ممکنه یک راهنکای استفاده از FarsiLibrary رو برای مبتدی ها هم بذارید چون من که تازه کار هستم کلا نمی دونم چطوری باید به پروژه اضفه کنم و از اون استفاده کنم

    ممنون

  • Hadi said

    Salam,
    In chizi ke shoma estefade kardid control haye WIndows ast ke tooye web nemishe azashoon estefade kard.
    version e Web e in component ha hanooz release nashode va moshakhasan version e feli e web dar hadde Alpha e. Albate mote'asefane be dalile kamboode vaght be soorate active ham kar nemishe rooshoon.

  • Mojtaba said

    Farsilibrary in VS 2010
    Follow these steps :
    Solution -> Properties -> Compile -> Advanced Compile Options -> Target Framework -> .Net framework4

    Farsilibrary imports System.Design which is not in " .Net framework4 Client Profile" and you should change your target framework to " .Net framework4"
    Default target framework in VS 2010 is " .Net framework4 Client Profile" that you need to change this option and after that you can use this component.

  • Zohreh said

    سلام
    برای رفع مشکل این کامپوننت در دات نت 4 چه کاری باید انجام بدم؟
    خطای زیر موقع باز کردن تقويم نمايش داده می شه
    The type initializer for 'FarsiLibrary.Utils.Internals.CultureHelper' threw an exception.

  • Mahdi said

    سلام

    ممنون از زحمتی که کشیدید.
    نسخه‌ی آخر فایل‌های DLL روی ویژوال استادیو ۲۰۱۰ کار نمی‌کنه.
    به غیر از Resources که کار می‌کنه، بقیه ( یعنی Utils, Win,... ) کار نمی‌کنه.
    یعنی وقتی توی ریسورها اضافه می‌کنم، توی برنامه و توی نیم اسپیس اصلاً نمی‌شناسه و نمیشه ازشون استفاده کرد.
    ولی نسخه‌ی قبلی که من داشتم، این مشکل رو نداره و میشه استفاده کرده.
    چند نفر از دوستان هم ظاهراً این مشکل رو داشتن :
    http://goo.gl/jCdWC
    ممنون میشم بررسی کنید و خبر بدید.

    با تشکر فراوان.

  • Mahdi said

    البته این رو هم بگم که من تارگت فریم ورک رو روی دات نت ۲ گذاشتم و این مشکل رو دارم.

  • Meysam said

    با سلام. این مشکل آخر رو من هم دارم+ اینکه Datepicker رو به DataGrid اضافه می کنیم با کلیک روی آن تاریخ قبلی که شمسی بوده به میلادی تغییر می کند و سپس با هر بار کلیک چندین سال به آن اضافه می شود.!!!!

  • Ali said

    http://www.codeproject.com/Articles/13664/Farsi-Library-Working-with-Dates-Calendars-and-Dat

    تاریخ فارسی

Add a Comment