PDA

View Full Version : سوال: بهترین روش و کمترین کدنویسی برای app.config



antisocial
دوشنبه 12 مرداد 1388, 22:10 عصر
سلام
فرض کنيد ميخواهيد برنامه اي بنويسيد که در اون کاربر بتونه کامپوننت هارو جابه جا
کنه و محل اونا براي اجراي بعدي بدون نياز به هيچ نرم افزار بانک اطلاعاتي در يک جايي ذخيره بشه
به نظر شما بهترين روش براي بالا رفتن سرعت و کمترين استفاده از کد براي خواندن و ذخيره چيه؟
من ابتدا کامپوننت هايي ساختم که قابليت حرکت رو با استفاده از يک خاصيت موويبل داشته باشند
و بعد از اون کلاسي نوشتم که قابليت ذخيره و خواندن روي فايل تنظيمات برنامه رو داره
و با ترکيب اينا اين روش به نظرم رسيد که کدش رو پايين گذاشتم
اما مشکلي که براي من پيش اومده اينه که هر کنترل درون فرم چندين خاصيت مجزا به غير محل قرار گرفتنش داره
مثل تغيير فونت اندازه ي فونت استايل فونت و غيره
حالا تصور کنيد در يک فرم بيست کنترل وجود داشته باشه و درينصورت حجم کد خيلي زياد ميشه
آيا دوستان ميتونند روش بهتري براي جلوگيري لز کدنويسي زياد پيشنهاد کنند
ممنون ميشم راهنمايي کنيد

ali_mnkt
سه شنبه 13 مرداد 1388, 00:18 صبح
دوست عزیز به نظر من اگه اطلاعات رو تو properties ذخیره کنی هم دسترسی به اونا راحت تره

و هم مدیریت کدت ساده تر می شه.

ali_mnkt
سه شنبه 13 مرداد 1388, 00:25 صبح
یه سوال هم داشتم:

من از data source استفاده کردم و connection String برنامه رو در فایل app.config ذخیره کردم

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

تغییر می کنه من می خوام یه text box بذارم که کاربر بتونه در نصب اولیه برنامه نام سرور رو

وارد کنه . خوب حالا من با چه کدی می تونم نام سرور که به صورت defult در بخش

connection string در فایل app.config هست تغییر بدم ؟

البته فایل app.config هنگام اضافه کردن datasource به صورت زیر در می یاد



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="app.config2.Properties.Settings.namayandegiConnect ionString"
connectionString="Data Source=reza;Initial Catalog=namayandegi;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>


حالا من فقط می خوام رشته connectionstring رو از یه text box در برنامه بگیرم و به جای

connectionstring در بالا ذخیره کنم. چطور باید این کار رو انجام بدم ؟

samirdev
سه شنبه 13 مرداد 1388, 00:41 صبح
می توانی از BinaryFomatter استفاده کنی. با استفاده از این کلاس می توان هر Object را به دیتای باینری سریالایز کرد و دوباره دی سریالایز کرد.

مثال برای یک کنترل:
ذخیره مشخصات :

System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
System.IO.FileStream fs = new System.IO.FileStream("c:\\File.dat", System.IO.FileMode.Create);
formatter.Serialize(fs, yourControl);

بازخوانی مشخصات :

System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
System.IO.FileStream fs = new System.IO.FileStream("c:\\File.dat", System.IO.FileMode.Create);
Control yourControl = (Control)formatter.Deserialize(fs);


حالا شما می توانید همین کد را برای چندین کنترل توسعه دهید و اگر در این زمینه هم مشکلی داشتید بگویید تا کمک کنم

antisocial
سه شنبه 13 مرداد 1388, 14:01 عصر
یه سوال هم داشتم:

من از data source استفاده کردم و connection String برنامه رو در فایل app.config ذخیره کردم

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

تغییر می کنه من می خوام یه text box بذارم که کاربر بتونه در نصب اولیه برنامه نام سرور رو

وارد کنه . خوب حالا من با چه کدی می تونم نام سرور که به صورت defult در بخش

connection string در فایل app.config هست تغییر بدم ؟

البته فایل app.config هنگام اضافه کردن datasource به صورت زیر در می یاد



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="app.config2.Properties.Settings.namayandegiConnect ionString"
connectionString="Data Source=reza;Initial Catalog=namayandegi;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>


حالا من فقط می خوام رشته connectionstring رو از یه text box در برنامه بگیرم و به جای

connectionstring در بالا ذخیره کنم. چطور باید این کار رو انجام بدم ؟

ببینید این فایل کانفیگی که شما ازش صحبت میکنید فایل temp کانفیگ هست و عملا امکان دسترسی داینامیک از طرف کاربر بهش وجود نداره مگراینکه خودتون برید تغییرش بدید
اما در مورد فایلی که میتونید مقداری رو به صورت داینامیک ذخیره کنید باید بگم که اون فایل کنار اسمبلی برنامه تو پوشه ی bin قرار داره و فرمت اسمش هم به این شکله
YOURPROJECT.exe.config
در ضمن بعد از هربار rebuild کردن پروژه تمامی اطلاعات از temp به اون فایل کپی میشه و اطلاعات قبلی اون از بین میره.
برای ذخیره کردن کردن یک مقدار توش هم میتونید اون تگ هایی رو که من توی کانفیگ قرار دادم رو شما هم قرار بدید و با استفاده از همون کلاسی که من نوشتم هر چی دوست داشتید ذخیره کنید فقط باید دقت کنید که پروژه رو Rebuild نکنید.
موفق باشید

antisocial
سه شنبه 13 مرداد 1388, 14:15 عصر
می توانی از BinaryFomatter استفاده کنی. با استفاده از این کلاس می توان هر Object را به دیتای باینری سریالایز کرد و دوباره دی سریالایز کرد.

مثال برای یک کنترل:
ذخیره مشخصات :

System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
System.IO.FileStream fs = new System.IO.FileStream("c:\\File.dat", System.IO.FileMode.Create);
formatter.Serialize(fs, yourControl);

بازخوانی مشخصات :

System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
System.IO.FileStream fs = new System.IO.FileStream("c:\\File.dat", System.IO.FileMode.Create);
Control yourControl = (Control)formatter.Deserialize(fs);


حالا شما می توانید همین کد را برای چندین کنترل توسعه دهید و اگر در این زمینه هم مشکلی داشتید بگویید تا کمک کنم

این اررور رو میده

Type 'System.Windows.Forms.Button' in Assembly 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.

اینم کدم


System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
System.IO.FileStream fs = new System.IO.FileStream("c:\\File.dat", System.IO.FileMode.Create);
formatter.Serialize(fs, button1 );

Amir Oveisi
سه شنبه 13 مرداد 1388, 19:35 عصر
هر کلاسی که میخواین serialize کنین باید یه Attribute براش Set کنین و اونو به عنوان serializable تعریف کنید.


[Serializable[
class yourClass
{
//class body
}

چند نکته مهم:
- همه کلاس های موجود در NET. قابل serialize شدن نیستن.
- اگر تو یه کلاسی که serializable تعریف کردین یک شی از کلاس دیگه ای تعریف شده باشه، اون کلاس هم باید serializable تعریف شده باشه.

ali_mnkt
سه شنبه 13 مرداد 1388, 21:37 عصر
ببینید این فایل کانفیگی که شما ازش صحبت میکنید فایل temp کانفیگ هست و عملا امکان دسترسی داینامیک از طرف کاربر بهش وجود نداره مگراینکه خودتون برید تغییرش بدید
اما در مورد فایلی که میتونید مقداری رو به صورت داینامیک ذخیره کنید باید بگم که اون فایل کنار اسمبلی برنامه تو پوشه ی bin قرار داره و فرمت اسمش هم به این شکله
YOURPROJECT.exe.config
در ضمن بعد از هربار rebuild کردن پروژه تمامی اطلاعات از temp به اون فایل کپی میشه و اطلاعات قبلی اون از بین میره.
برای ذخیره کردن کردن یک مقدار توش هم میتونید اون تگ هایی رو که من توی کانفیگ قرار دادم رو شما هم قرار بدید و با استفاده از همون کلاسی که من نوشتم هر چی دوست داشتید ذخیره کنید فقط باید دقت کنید که پروژه رو Rebuild نکنید.
موفق باشید

ولی من شنیدم می شه تغییراتی تو اون اعمال کرد ( کاربر هم می تونه ) اما چطوری شو نتونستم بفهمم

ali_mnkt
سه شنبه 13 مرداد 1388, 21:49 عصر
راستی من اون فایلی که گفتین در bin قرار داره رو هم چک کردم اطلاعات داخلش دقیقا

همون اطلاعاتی بود که در فایل temp قرار داشت.

حالا اگه من بتونم اطلاعات اون فایل که در پوشه bin قرار داره رو تغییر بدم کافیه ؟

اگه می شه کد کلاسی که واسه تغییر اون نوشتید رو بذارید تا بقیه هم با نحوه کار شما آشنا بشن.

antisocial
چهارشنبه 14 مرداد 1388, 01:31 صبح
بفرمایید
البته دقت کنید که ساختار فایل تنظیماتتون شبیه این سمپلی باشه که من توی این فولدر گذاشتم
.در ضمن شما هر چی که توی اون فایلی که کنار اسمبلی نیست بنویسید به طور خود کار بعد از یک rebuild تمامش کپی میشه رو همون.با تمام جزئیات.
در واقع این تنظیمات موقعی به کار شما میاد که نرم افزارتون آمادس و به صورت پکیج دراومده و کار این فایل موقت تنها نگه داشتن ساختار پیش فرضه
البته همونطور که میبینید بنا به دلایلی شما هنگام ذخیره باید روی هردوفایل ذخیره کنید.
هر چند که فایل موقت اطلاعاتش رو از دست میده.
و شما برای ذخیره و خواندن تنها به فایل اصلی احتیاج دارید که توی bin هست .
و این یکی موقت تنها برای طراحی تگ ها استفاده میشه.
امیدوارم متوجه شده باشید
موفق باشید

ali_mnkt
پنج شنبه 15 مرداد 1388, 01:14 صبح
مرسی دوست عزیز از کمکت ولی من اینجا الان یه مشگل دارم :


من کدی که هم در فایل temp مربوط به app.config و هم فایل app.config در پوشه bin به صورت

زیره که البته هنگامی که مثلا برای یه combo box از طریق خصوصیت datasource اون یه

connection ایجاد می کنم خود vs اون رو ایجاد می کنه .


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="app.config_new.Properties.Settings.namayandegiConn ectionString"
connectionString="Data Source=reza;Initial Catalog=namayandegi;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>


خوب حالا من از کد کلاس شما برای مثلا read کردن این اطلاعات استفاده می کنم



try
{
System.Configuration.AppSettingsReader AppReader = new System.Configuration.AppSettingsReader();
return (Convert.ToString((AppReader.GetValue(Key, typeof(System.String)))));


}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}



اما روی نام key خطا می گیره و می گه شناخته شده نیست !!!! خوب حالا من برای حل

این مورد باید چیکار کنم ؟

antisocial
جمعه 16 مرداد 1388, 01:21 صبح
ببینید من درین مورد میدونم جرا این خطا رو میده چون که اون attribute ایجاد نشده و من نمیدونم چه طور باید درین حالت اطلاعات رو ذخیره کنیم

.اما اینجا یک بحثی هست مگه شما نمیخواین که یه مقدار رو از کاربر بگیرین و ذخیره کنین؟
خوب چرا از فرمت نوشتاری app.config که من براتون توی اون فایل گذاشته بودم استفاده نمیکنید!!!!!؟
چه دلیلی داره هرچی سی شارپ توی اون فایل جنریت میکنه شما هم حتما ازون فرمت استفاده کنید؟!!!!!
اگر واقعا حتما باید ازین فرمت استفاده کنید فکر میکنم بهترین منبع برای config
سایت www.codeproject.com (http://www.codeproject.com)
باشه که کاملا همه رو توضیح داده....
البته من هم چند تا مقاله راجع به این قضیه دارم که اگر بتونم پیداشون کنم حتما براتون توی سایت میذارم
ببخشید که بیشتر ازین نتونستم کمک کنم