چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید

آپدیت روزانه

بیش از 1500 مطلب آموزشی

نیازهای روز

تنظیمات برنامه

در این پست با نحوه ایجاد و ذخیره اطلاعات مربوط به تنظیمات در خود نرم‌افزار با استفاده ویژوال استودیو آشنا خواهید شد. قابلیت توکار تنظیمات برنامه(Application Settings) در برنامه‌های دسکتاپ تحت دات نت، راه آسان جهت امکان ایجاد، ذخیره سازی و سفارشی سازی برنامه را در اختیار برنامه‌نویس قرار خواهد داد. این در حالی است که تنظیمات نرم‌افزار دسکتاپ شما قادر به ذخیره هر نوع از داده‌ها قابل پشتیبانی دات‌نت خواهد بود.
با استفاده از ویژوال استودیو یا هر نرم‌افزار ویرایش کد قادر هستید یک فایل تنظیمات جدید به برنامه اضافه نموده و مقادیر جدید در آن ثبت کنید، همچنین آنها را بخوانید یا تنظیمات را تغییر دهید.

محدودیت‌های تنظیمات برنامه:

شما قادر نیستید از تنظیمات برنامه در برنامه‌های مدیریت نشده میزبان دات‌نت استفاده کنید. از جمله این برنامه‌ها:

  1. control hosting in Internet Explorer
  2. C++ for Microsoft Office
  3. Microsoft Outlook add-ins
  4. Visual Studio add-ins
  5. و ...

معمولا برخی از خواص رو نمی‌توانید در برنامه‌ دسکتاب بیابید، از جمله بارزترین نمونه خواص سایز و موقعیت آخرین اجرا برنامه است که معمولا شما برای حل این مشکل از همین تنظیمات برنامه استفاده خواهید کرد.
تنظیمات برنامه به صورت پیشفرض داده‌های وارد شده را رمزنگاری نخواهد کرد و به همان صورت که وارد می‌شود ذخیره خواهد شد. شما هرگز نباید اطلاعات مربوط به امنیت را همانند متن ورودی و بدون رمزنگاری ذخیره کنید. اگر در صورتی که شما چنین اطلاعات حساس می‌خواهید ذخیره کنید به عنوان یک توسعه‌دهنده مسئول حفظ امنیت آن خواهید بود. در صورتی که می‌خواهید رشته اتصال به بانک اطلاعاتی را ذخیره کنید به پیشنهاد مایکروسافت از سیستم یکپارچه امنیت استفاده کنید نه متوسل شدن به استفاده از رمز عبور سخت در داخل کد. برای اطلاعات بیشتر اینجا کلیک کنید.

افزودن اولین عضو به فایل تنظیمات برنامه:

برای ایجاد اولین عضو بر روی Properties دو بار کلیک کنید و با نمایان شدن فرم تب Settings را کلیک کنید:

برای ایجاد اولین عضو در بخش Name، نام عضو را وارد نماید، از DropDown بخش Type نوع آن را مشخص کنید و در DropDown بخش Scope بر روی User قرار دهید و در پایان مقداری برای آن مشخص کنید و Ctrl + S را جهت ذخیره فشار دهید، اولین عضو با نام myColor با موفقیت ایجاد گردید.

سطح دسترسی:

فایل settings با دو سطح دسترسی قابل استفاده خواهد بود:

  1. Internal
  2. External

Public - در صورت استفاده از این سطح دسترسی در کلیه لایه‌ها می‌توان به این فایل دسترسی یافت.

Internal - با انتخاب این سطح دسترسی فایل تنظیمات فقط در پروژه جاری قابل دسترس خواهد بود.

ویرایش تنظیمات برنامه در زمان اجرا:

تنظیمات تعریف شده با سطح محدود(Application-Scoped) فقط خواندنی خواهند بود همانند تعریف یک شی و مهر کردن آن با کلمه کلیدی const در زبان سی‌شارپ که البته برای تغییر فقط با ویرایشگر کد و در زمان طراحی قادر به تغییر هستید از سمت دیگر تنظیمات با سطح کاربری(User-Scoped) این امتیاز رو برای شما خواهند داشت که در زمان اجرا برنامه مقدار آنها را با فراخوانی متد Save تغییر دهید.

برای دسترسی به تنظیمات و تغییر مقدار آن به صورت زیر امکان پذیر خواهد بود:

// C#
Properties.Settings.Default.myColor = Color.AliceBlue;

که بعد از تغییرات لازم است متد زیر جهت ذخیره تغییرات فراخوانی شود در غیر این صورت دستخوش تغییرات نخواهید شد:

// C#
Properties.Settings.Default.Save();

خواندن تنظیمات برنامه در زمان اجرا:

شما در دو حالت User-Scoped و Application-Scoped قادر به خواندن تنظیمات در زمان اجرا پروژه با استفاده از شی پراپرتی خواهید بود. شی خواص‌ها به صورت پیشفرض از طریق Properties.Settings.Default و نام عضو قابل دسترس هستند که البته قبل از دسترسی نیاز به تعریف آنها است.

برای دسترسی به عضو myColor نیاز است که در فایل Settings یک پراپرتی با نام myColor با نوع System.Drawing.Color با مقدار پیشفرض ایجاد گردد سپس به صورت زیر عمل کنید.

// C#
this.BackColor = Properties.Settings.Default.myColor;

افزودن چند فایل Settings به برنامه:

به صورت پیشفرض با ایجاد یک برنامه دسکتاپ دات‌نت در زیرمجموعه Properties فایل settings.settings قابل دسترس است که ‌می‌توان برای مشاهده بر روی آن دو بار کلیک نمود یا با فشار دادن Alt + Enter و باز شدن پنجره ApplicationSettings و انتخاب تب Settings به این پنجره دسترسی داشت، همچنین شما قادر هستید به تعداد دلخواه این فایل را به پروژه اضافه نموده و از آنها استفاده کنید.

در صورتی که قصد دارید یک فایل Settings جدید ایجاد کنید بر روی پروژه کلیک راست نموده و New Item را از شاخه Add کلیک کنید تا دیالوگ Add New Item برای شما نمایان گردد، سپس در پنل جستجو کلمه settings را جستجو کنید.

فایل Settings را انتخاب و نامی برای آن در نظر گرفته و دکمه Add را کلیک کنید، فایل به ریشه پروژه اضافه خواهد شد، در صورت نیاز می‌توان با عمل Drog&Drop آن را به زیر مجموعه Properties منتقل کرد.

مثال:

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

توجه کنید که در برنامه‌های با تعداد کاربری زیاد لازم است بجای استفاده از چنین روش‌های به نوع پروژه از روش‌های متفاوت از جمله پایگاه داده استفاده نمود که در سرور به چنین اطلاعاتی دسترسی یافت که بتوان بر روی آنها کوئری زد اما در صورت استفاده از برنامه مشابه این مثال بهترین گزینه ذخیره کردن این اطلاعات در تنظیمات برنامه خواهد بود که بدون وابستگی و ایجاد کلاس و تنظیمات به چنین اطلاعات دسترسی یافت.

با وارد کردن اطلاعات و کلیک بر روی دکمه Generate اطلاعات وارد شده در تنظیمات برنامه ذخیره شده و با اجرای مجدد برنامه این اطلاغات موجود خواهد بود:

private void btnFormGenerator(object sender, EventArgs e)
{
	if(chboxRememberMe.Checked)
	{
		Settings.Default.DBNameSetting = txtDatabase.Text;
		Settings.Default.UserIdSetting = txtUserId.Text;
		Settings.Default.PasswordSetting = txtPassword.Text;
		Settings.Default.ServerNameSetting = txtServer.Text;
		Settings.Default.RememberMe = chboxRememberMe.Checked;
		Settings.Default.Output = txtOutput.Text;
		Settings.Default.Save();
	}
}

بعد از هر بار لود برنامه اطلاعات از تنظیمات برنامه خوانده شده و بر روی شی‌های ایجاد شده اعمال خواهد شد:

private void FormLoad_Load(object sender, EventArgs e)
{
    if(Settings.Default.RememberMe)
    {
		txtOutput.Text = Settings.Default.Output;
		txtServer.Text = Settings.Default.ServerNameSetting;
		txtDatabase.Text = Settings.Default.DBNameSetting;
		txtPassword.Text = Settings.Default.PasswordSetting;
		txtUserId.Text = Settings.Default.UserIdSetting;	
    }
}

بازگردانی تغییرات:

یکی از قابلیت‌های جالب استفاده از تنظیمات خود برنامه استفاده از متد Reset است که در آن تعبیه گردیده که با فراخوانی کلیه تغییرات به حالت پیشفرض باز خواهد گشت:

// C#
Properties.Settings.Default.Reset();

متد کمکی:

در کلاس static زیر که نیاز به نمونه سازی از آن نیست دو متد جنریک کمکی در آن موجود است که شما قادر خواهید بود از هر کجای برنامه با فراخوانی متد به مقادیر تنظیمات دسترسی داشته و یا مقدار جدید در آن درج کنید. از مزایا استفاده از متدهای زیر نوع Generic بودن و نیاز به فراخوانی متد Save بعد از هر عملیات نیست. در متد ChangeSetting پارامتر دوم را از نوع dynamic در نظر گرفته شده تا نیاز به عمل Cast با فراخوانی متد نباشد.

using System;
using System.Linq.Expressions;

namespace HelpfulLinks.App.Settings
{
    public static class ManageSettings
    {
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expression"></param>
        /// <param name="value"></param>
        public static void ChangeSetting<T>(Expression<Func<T>> expression, dynamic value)
        {
            var memberExpression = expression.Body as MemberExpression;
            if (memberExpression == null) return;
            Properties.Settings.Default[memberExpression.Member.Name] = value;
            Properties.Settings.Default.Save();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static T GetSetting<T>(Expression<Func<T>> expression)
        {
            var memberExpression = expression.Body as MemberExpression;
            return (T)Properties.Settings.Default[memberExpression.Member.Name];
        }
    }
}

نحوه استفاده:

جهت دسترسی به مقادیر کافیست که با فراخوانی متد و انتخاب شی به مقدار آن دسترسی یافت.

GetSetting(() => Properties.Settings.Default.UserName);

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

ChangeSetting(() => Properties.Settings.Default.UserName, "Hello World !");

برای اطلاعات بیشتر اینجا و اینجا کلیک کنید.

امید نصری