صفحه 1 از 6 123 ... آخرآخر
نمایش نتایج 1 تا 40 از 237

نام تاپیک: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

  1. #1
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    سلام دوستان.
    طبق قولی که در رابطه با قرار دادن آموزش های مربوط به "ساخت یک پروژه سی شارپ از ابتدا تا انتها" داده بودم این ویدئوها رو میتونید از آدرس زیر دانلود کنید.
    https://barnamenevis.org/showthread.p...AA%D9%87%D8%A7
    اما تصمیم گرفتم برای اینکه نظم اون تاپیک بهم نخوره، این تاپیک رو برای رسیدگی به مشکلات شما در ارتباط با این آموزش ها ایجاد کنم. برای بازدهی بیشتر این تاپیک، لطفا به موارد زیر توجه بفرمایید:
    1. فقط در محدوده آموزش هایی که قرار داده میشه سوالات یا اشکالات خودتون رو مطرح بفرمایید و از پرسیدن سوالات بی ارتباط با بحث آموزش ها جدا" پرهیز کنید.
    2. از گذاشتن پست هایی برای تشکر جدا" خودداری کنید. اجازه بدیم پست هایی اینجا گذاشته بشه که محتوای فنی داشته باشه.
    3. لطفا از گذاشتن پست تکراری و فاقد محتوا پرهیز کنید و قبل از گذاشتن یک پست، ابتدا بقیه پست ها رو مشاهده کنید. شاید جواب سوالتون در اون پست قرار داشته باشه.
    توصیه میکنم با دیدن هر ویدئو، بعد از پرسیدن سوالات و ابهامات خودتون بصورت عملی شروع به طراحی یک پروژه کنید و قدم به قدم با اموزش ها جلو بیاید(شبیه به مواردی که در آموزش ها می بینید). شک نکنید که تا شروع به نوشتن نکنید چیزی رو یاد نمیگیرید. خیلی ها هستن که اگه ازشون بپرسید میگن که ما کدها و دستورات رو بلدیم ولی نمیتونیم پروژه بنویسیم. دلیلش اینه که هیچوقت استارت کار رو بصورت عملی نزدن. تا عملی کار نکنید هرگز موفقیتی حاصل نمیشه.
    یادمون نره که شرط موفقیت، فکر کردن، ایده داشتن و تلاش کردن هست.
    توجه : در طول ضبط هر ویدئو اگر موردی فراموش شده که ذکر بشه، در ابتدای ویدئوی بعدی این موارد ذکر شده.
    پیشاپیش از همکاری همه شما دوستان، قدردانی میکنم.
    آخرین ویرایش به وسیله veniz2008 : یک شنبه 03 شهریور 1392 در 12:37 عصر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

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

  3. #3
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718
    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام وخسته نباشید
    چون فرمودید مخاطبان این آموزش افراد سطح متوسط هم هستند پیشنهادم این هست که به صورت سه لایه پیاده سازی بشه من قسمت اول رو دیدم خوب بود
    موفق باشید
    سلام دوست عزیزم.
    ممنونم از اینکه اولین نظر رو شما دادید.
    این ویدئوها بصورت کامل آماده شدن ولی در ارتباط با پیشنهادتون :
    هدف اصلی این آموزش ها مخاطبان مبتدی هست و تلاش میشه که این مخاطبان تا حد متوسطی از لحاظ کدنویسی بالا کشیده بشن.
    باور بفرمایید اگر برای یک مبتدی که هنوز با مفاهیم آشنا نیست من برم سراغ چند لایه نوشتن، چیزی رو یاد نخواهد گرفت. چند لایه آموزش دادن برای کسانی مفید خواهد بود که با مباحث اولیه آشنایی دارند.
    نقل قول نوشته شده توسط ma.rad مشاهده تاپیک
    سلام دوست عزیز
    من مخالف همچین آموزش هایی هستم چون عقیده دارم افراد برای یادگیری برنامه نویسی باید مطالعه کنن کلاس برن وتمرین داشته باشن مثل خود ما...
    یکی از اشکالات ما بچه های کامپیوتر همین مسئله هست که علم مون رو همینطوری در اختیار دیگران قرار می دیم .
    ارزش کارمون کم می شه. وبازار رو از دست می دیم برنامه نویسی باید در اختیار متخصص باشه یعنی یه مهندس نرم افزار،شما تا حالا دیدید یه مکانیک مطب بزنه وبیمار ببینه...
    اینجا ماباید به هم رشته ای های خودمون کمک کنیم ومشکلاتشون رو رفع کنیم
    سلام دوست من.
    ممنونم که نظر دادید.
    نظر من متفاوت با نظر شما هست.
    عقیده و باور من این هست که هر کس با توجه به امکاناتی که در اختیار داره باید به دیگران کمک کنه.
    اگر این ویدئوها بتونه حتی به یک نفر چیزی رو یاد بده، اون لحظه، لحظه ای هست که من به هدفم رسیدم.
    این ویدئوها فقط یک نقطه شروع خواهد بود برای کسانیکه واقعا قصد یادگیری دارند ولی امکاناتش رو ندارند. بقیش به تلاش و پشتکار خودشون مربوط میشه.
    همین چند روز پیش توی بخش "گفتگو با مسولین سایت" یه نفر تاپیک گذاشته بود و میگفت که دوس داره یاد بگیره ولی پول نداره. از این جور آدم ها زیاد هست دوست من.
    اگر قراره نون شب من با این 16 ویدئو قطع یا کم بشه، همون بهتر که بشه. این آموزش ها حتی 1 درصد از زبان سی شارپ هم نیستن.
    یاد دادن و یاد گرفتن دو فرآیند هم روند و موازی هستن. من همزمان که دارم به دیگران یاد میدم در کنارش دارم از دیگران یاد می گیرم.
    من همیشه گفتم : در کنار پشتکار خودم، برنامه نویس به من کمک کرده تا بزرگ بشم. اخلاق حکم میکنه که امروز من به دیگران کمک کنم. انصاف نیست که الان یه خورده یاد گرفتم نسبت به دیگران بی تفاوت باشم.
    به هر حال، هرکس به یک شکل کمک میکنه ولی ثابت شده که آموزش های مالتی مدیا تاثیرگذاری خیلی بیشتری دارند.
    بازم از اینکه نظرتون رو دادید تشکر میکنم.
    آخرین ویرایش به وسیله Mahmoud.Afrad : چهارشنبه 11 تیر 1393 در 20:08 عصر

  4. #4
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

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

  5. #5
    کاربر دائمی آواتار amir200h
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    بروجرد->تهران->قم
    سن
    33
    پست
    782

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    در مورد حذف کردن گروه های درسی که فرمودین نیاز به حذف نیست. من با این حرفتون مخالفم.
    توی یک برنامه برای هر جدولی که ساخته میشه باید چهار عمل اصلی رو در برنامه براش ایجاد کنیم. البته نظر شخصیمه و تو صد در صد پروژه هام برای کاربر این امکانو فراهم میکنم.
    البته نوع حذف کردن قضیه ش فرق میکنه چون ممکنه با یک حذف کردن حتی یک رکورد کل برنامه از کار بیوفته(در بعضی موارد) مخصوصا در زمان گزارش گیری و جستجو به مشکل بر بخوریم.
    من خودم معتقدم که هیچ رکوردی نباید از بانکمون حذف بشه چون به نظرم ذات پایگاه داده که همون ذخیره داده هاست زیر سوال میره.(نظر شخصیمه و میدونم هم که در بعضی موارد صحیح نیست)
    من خودم همیشه برای جداولم یک فیلد به نام State تعریف میکنم از نوع bit. و با true یا false کردن این مقدار در واقع همون عمل حذف رو انجام میدم.
    موفق باشید ...

  6. #6
    کاربر دائمی آواتار amir200h
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    بروجرد->تهران->قم
    سن
    33
    پست
    782

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    گفتن به علت کم بود وقت و اینکه دل بخواه هستش البته موافقم باید برای admin در نظر گرفت بشه
    حالا چرا بیت ؟با همون id همیشه انجام میشه شما دلیلی دارین؟
    راحتی کار. اگه مقدارش true بود یعنی فعال و اگه false بود یعنی غیرفعال یا همون حذف شده

  7. #7
    کاربر دائمی آواتار asrah6
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    اصفهان
    پست
    153

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

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

  8. #8
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط amir200h مشاهده تاپیک
    در مورد حذف کردن گروه های درسی که فرمودین نیاز به حذف نیست. من با این حرفتون مخالفم.
    توی یک برنامه برای هر جدولی که ساخته میشه باید چهار عمل اصلی رو در برنامه براش ایجاد کنیم. البته نظر شخصیمه و تو صد در صد پروژه هام برای کاربر این امکانو فراهم میکنم.
    البته نوع حذف کردن قضیه ش فرق میکنه چون ممکنه با یک حذف کردن حتی یک رکورد کل برنامه از کار بیوفته(در بعضی موارد) مخصوصا در زمان گزارش گیری و جستجو به مشکل بر بخوریم.
    من خودم معتقدم که هیچ رکوردی نباید از بانکمون حذف بشه چون به نظرم ذات پایگاه داده که همون ذخیره داده هاست زیر سوال میره.(نظر شخصیمه و میدونم هم که در بعضی موارد صحیح نیست)
    من خودم همیشه برای جداولم یک فیلد به نام State تعریف میکنم از نوع bit. و با true یا false کردن این مقدار در واقع همون عمل حذف رو انجام میدم.
    موفق باشید ...
    ممنونم از اینکه نظرتون رو دادید.
    همونطور که در ویدئو هم عرض کردم میشد گذاشت و بهتر هم هست که در یک پروژه واقعی این امکان هم اضافه بشه ولی باید مواظب مدیریت کردن حذف در جداول مبدا باشیم. مثلا در هیمن مثال ما، باید این رو مد نظر داشته باشیم که اگر از جدول گروه، رکوردی حذف بشه بایستی در جدول سوالات هم، رکوردها(سوالاتی) که وابسته به این گروه هستن رو هم حذف کنیم. در کل با این نظرتون موافقم که میشد این مورد رو هم اضافه کرد ولی بخاطر اینکه در فرم سوالات این مورد بصورت کامل پیاده سازی میشه و ویدئوهای اولیه هم وقت گیر نشه از گذاشتن این امکان خودداری کردم.
    اما در مورد اینکه گفتید اعتقاد دارید هیچ رکوردی رو حذف نکنیم، به نظرم صحیح نیست. ما با توجه به شرایط پروژه و نوع جداولمون این حذف رو قرار میدیم. مثلا در سیستم بایگانی ما معمولا هیچوقت سندی رو حذف نمی کنیم چون بایگانی اسمش به خودش هست ولی میتونیم از همین فیلد bit ای که شما گفتید استفاده کنیم و رکوردهای خیلی قدیمی رو (بر حسب یک شرط مثلا سال) غیر فعال کنیم. ولی در جاهایی که نیازی به این ذخیره سازی نیست بهتره که رکوردها رو حذف کنیم تا بیهوده فضای اضافی اشغال نکنه و بر روی performance دیتابیس تاثیر منفی نذاره.
    نقل قول نوشته شده توسط asrah6 مشاهده تاپیک
    سلام و تشکر فراوان از آموزشهای جنابعالی انشاالله به امید روزی که هیچ کس در امر آموزش به دیگران خسیس نباشد
    چند پیشنهاد :
    اگر امکان دارد جدولی اضافه کنید که جوابهای کاربران( آزمون دهنده ها ) را ذخیره تا در گزارش گیری های بعدی و مقایسه نمرات آنها استفاده شود و همچنین فیلدی به جدول گروه های امتحانی اضافه کنید تا مدیر بتواند از بین چندین گروه امتحانی یکی را برای امتحان دادن کاربران فعال کند و همه گروههای امتحانی نمایش داده نشود
    در پایان باز هم تشکر و اگر امکان دارد ویدئوهای بعدی را سریعتر آماده و آپلود نمایید.
    سلام دوست من.
    همونطور که در پست 4 هم عرض کردم این ویدئوها بصورت کامل آماده شدن و متاسفانه امکان تغییری وجود نداره.
    قطعا در یک پروژه واقعی باید چنین موردی رو قرار داد ولی این پروژه قرار نیست کاملا واقعی باشه. ساخت یک پروژه واقعی بصورت مالتی مدیا باور کنید ساعت ها بیشتر از اون چیزی که تا به امروز وقت گذاشتم، وقت میبره. همین 16 ویدئو فکر کنم حدود 20 ساعت زمان برده که اگر قرار بر کامل بودن اون داشتم حداقل به 20 ساعت دیگه هم زمان نیاز بود که فکر میکنم خارج از حوصله مخاطب باشه.
    ولی در کل عجله نکنید. خواهید دید که ویدئو به ویدئو مطالب سطحشون بالاتر خواهد رفت و مطالب گسترده تر و حرفه ای تری رو یاد خواهید گرفت. سعی شده که آروم آروم ذهن شما به مطالب عادت کنه.
    در مورد قرار دادن ویدئوها سعی میکنم این کار رو سریعتر انجام بدم ولی اینترنت کشورمون رو که بهتر از من می شناسید. سرعت اینرنت بعضی مواقع اونقدر پایین میاد که حتی نمیشه یک فایل 5 مگی رو اپلود کرد.

  9. #9
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام
    اگر در حین کد نوشتن کدها رو بیشتر با متد مینویشتین شاید بهتر بود خصوصا کدهایی مثل لود اطلاعات
    مثلا زمانی که شما مخواین تغییرات اعمال شده رو نشون بدین به کسی که جدیدا امده سراغ این مباحث فراخوانی فرم لود (با دوتا نال )تو ذهنش درکش شاید مشکل تر باشه از یه متد ساده که این کار رو انجام میده هم چنین اگر می گفتین بقیه کدهای نوشته شده خودشون رو درصورت تمایل بذارن و پروژه مرحله به مرحله پیش میرفت شاید بهتر باشه و اگر جایی کسی چیزی رو اشتباه درک میکرد اصلاح هم میشد هر چند نکته مبهمی نداره
    تشکر از زحماتتون
    موفق باشید
    حرف شما صحیح هست دوست من.
    در ویدئوهای بعدی و در جاهایی که نیاز هست اکثرا به چنین شکلی که شما گفتید اقدام کردم و یک یا چند متد رو برای این کار نوشتم و به جای تکرار کردن کدهای زیاد و تکراری از همین صدا زدن نام متدها استفاده شده است. یعنی دستوراتی رو که چندین بار در یک فرم بایستی اجرا بشن درون یک متد نوشتم و در بخش های مختلف همون متد با یک خط کد صدا زده شده.

  10. #10
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    در مورد بدست آوردن idgroup که در جدول سوالات باید درج بشه من همیشه اسم گروه رو میگرفتم و بعد یه دونه select وبریز تو data table و بعد سطرid رو بدست می آوردم که روش کار شما خیلی عالی بودو استاندارد و کوتاه همچنین من تابع لود اطلاعات با دستور sql command مینوشتم کی خیلی طولانی تر از دستورات شما بود ضمنا ترس استفاده از استور پروسجور ها هم کاملا برطرف شد حین کار هم نکاتی مفیدی گفته شد که تا حالا باش مواجه نشده بودم و همه رو تو این ویدیو ها یاد گرفتم
    ممنون

  11. #11
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    با سلام و تشکر از زحماتتون
    نکته مربوط به DataRowView جالب بود و راستش قبلا این رو ندیدم اگر توضیح بیشتری راجبش می دادین خوب بود چطور ما به یک آیتم دسترسی نداریم ولی میتونیم تون رو CAST کنیم و بریزیم تو یه دیتا رو ویو و ازش استفاده کنیم ؟؟
    dataAdapter.SelectCommand.Parameters.AddWithValue(  "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);

    من برای این قسمت از چکلیست باکس استفاده کردم و به نظرم دردسرش کمتر بود فقط یک سلکت اضافی داشت

    موفق باشین

  12. #12
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام و تشکر از زحماتتون
    نکته مربوط به DataRowView جالب بود و راستش قبلا این رو ندیدم اگر توضیح بیشتری راجبش می دادین خوب بود چطور ما به یک آیتم دسترسی نداریم ولی میتونیم تون رو CAST کنیم و بریزیم تو یه دیتا رو ویو و ازش استفاده کنیم ؟؟
    dataAdapter.SelectCommand.Parameters.AddWithValue(  "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);

    من برای این قسمت از چکلیست باکس استفاده کردم و به نظرم دردسرش کمتر بود فقط یک سلکت اضافی داشت
    سلام دوست من.
    اجازه بدید ابتدا درباره دلیل رخ دادن خطا در رویداد SelectedIndexChanged صحبت کنم.
    در حالت عادی که یک کمبوباکس خالی هست، selectedindex اون برابر با 1- هست.
    رویداد SelectedIndexChanged زمانی فعال میشه که selectedindex کمبو تغییر (change) کنه.
    دلیل اینکه به خاصیت selectedvalue یک آیتم دسترسی نداریم این هست که همزمان که کمبو در حال پر شدن هست (یعنی selectedindex کمبوباکس تغییر میکنه) رویداد SelectedIndexChanged صدا زده میشه که ناتوان از دریافت Value آیتمی هست که هنوز بصورت کامل بارگذاری نشده. (comboboxname.selectedvalue ).
    اما در مورد قطعه کدی که من استفاده کردم :
    ابتدا لازم هست که مختصری درباره DataView بدونیم. بصورت ساده اگر دیتاتیبل رو یک جدول از داده های واقعی (RealData) در نظر بگیریم یک دیتاویو یک Shot (عکس یا نما) از روی جدول واقعی ما خواهد بود. به بیان دیگه یه دیتاویو یه جدول مجازی از روی جدول واقعی (دیتاتیبل یا دیتاست) ماست که قابلیت سفارشی کردن مسقیم اطلاعات رو داره (مثل فیلتر کردن اطلاعات. در صورتیکه دیتاتیبل مستقیما چنین امکانی رو نداره).
    یه کم هم بهتره درباره DataRow بدونیم. در حقیقت DataRow برای دسترسی به سطرهای درون یک دیتاتیبل (یا دیتاست) بکار میره. چه زمانیکه بخوایم سطری رو به دیتاتیبل اضافه کنیم چه زمانیکه قصد حذف سطری رو داریم و چه زمانیکه قصد خوندن یک ستون از یک سطر رو داشته باشیم، از DataRow کمک میگیریم.
    اما حالا باید ببینیم که DataRowView چی هست. بصورت ساده DataRowView یک سطر از یک دیتاویو هست یا به عبارت دیگه DataRow ای هست که به دیتاتیبل اشاره داره. بنابراین زمانیکه من به این سطر اشاره میکنم همونجا هم اعلام میکنم که به مقدار کدوم ستون از این سطر نیاز دارم :
    ((DataRowView)CmbGroup.SelectedItem)["GroupID"]

    اما در مورد روشی که شما استفاده میکنید.
    قطعا خودتون هم قبول دارید که این کار پاک کردن صورت مساله و مواجه نشدن با خطا هست.
    من نظرم اینه که گذاشتن چک لیست باکس و سلکت زدن خیلی سخت تر (و البته غیر بهینه بودن) هست تا یک نصفه خط کد.
    بهرحال بسیار خوشحالم که شما ابهامی که براتون بوجود اومده بود رو مطرح کردید و بی تفاوت از کنار موضوع رد نشدید.
    آخرین ویرایش به وسیله veniz2008 : دوشنبه 11 شهریور 1392 در 18:03 عصر

  13. #13
    کاربر دائمی آواتار amir200h
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    بروجرد->تهران->قم
    سن
    33
    پست
    782

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط GoldenClick مشاهده تاپیک
    سلام
    با تشکر از زحمتتون بابت آموزشها
    اگه امکانش هست سورس مریوط به هر قسمت را هم قرار دهید
    اتفاقا خوب کاری میکنن سورس رو در اختیار دوستان نمیزارن. اگه سورس رو داشته باشین دیگه خودتون سراغ نوشتن کد نمیرین
    بهتره خودتون شروع کنین به ساخت همین پروژه و نمرین کنین هرجاش به مشکل برخوردین به فیلم رجوع کنین

  14. #14
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    من نظرم اینه که گذاشتن چک لیست باکس و سلکت زدن خیلی سخت تر (و البته غیر بهینه بودن) هست تا یک نصفه خط کد.
    با سلام مجدد نه من هم این رو به روش شما انجام دادم فقط در فرم سوالات بجای گرید از چکلیست باکس استفاده کردم که تفاوت چندانی نداشت ولی در یک جا از دیتا ریدر استفاده کردم

    کدهای این فرم
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;

    namespace MYAZMOON
    {
    public partial class frmdefineqestions : Form
    {
    private readonly SqlConnection connection;
    private SqlDataAdapter dataAdapter;
    private DataTable dt;

    public frmdefineqestions()
    {
    connection =
    new SqlConnection(
    @"Data Source=.\SQLEXPRESS;AttachDbFilename=
    |DataDirectory|\DBAZMOON.mdf;Integrated Security=True;User Instance=True");
    InitializeComponent();
    }

    private void frmdefineqestions_Load(object sender, EventArgs e)
    {
    comboBox1loadddata();
    comboBox2.SelectedIndex = 0;
    loadqustintxt();
    }

    private void loadqustintxt()
    {
    dt = new DataTable();
    dataAdapter = new SqlDataAdapter("qustiontex", connection);
    dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
    dataAdapter.SelectCommand.Parameters.AddWithValue( "@GROUPID",((DataRowView) comboBox1.SelectedItem)["GROUPID"]);
    dataAdapter.Fill(dt);
    checkedListBox1.DataSource = dt;
    checkedListBox1.DisplayMember = "QUSETIONTEXT";
    checkedListBox1.ValueMember = "QUSTIONID";
    }

    private void comboBox1loadddata()
    {
    dt = new DataTable();
    dataAdapter = new SqlDataAdapter("loaddall", connection);
    dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
    dataAdapter.Fill(dt);
    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "GROUPNAME";
    comboBox1.ValueMember = "GROUPID";
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    loadqustintxt();
    }

    private void addqustion_Click(object sender, EventArgs e)
    {
    var command = new SqlCommand("addqusetion", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@QUSETIONTEXT", textBox1.Text);
    command.Parameters.AddWithValue("@CASE1", textBox2.Text);
    command.Parameters.AddWithValue("@CASE2", textBox3.Text);
    command.Parameters.AddWithValue("@CASE3", textBox4.Text);
    command.Parameters.AddWithValue("@CASE4", textBox5.Text);
    command.Parameters.AddWithValue("@ANSWER", comboBox2.Text);
    command.Parameters.AddWithValue("@GROUPID", comboBox1.SelectedValue);
    connection.Open();
    command.ExecuteNonQuery();
    connection.Close();
    frmdefineqestions_Load(null, null);
    MessageBox.Show("سوال درج شد");
    cleratxtbox();
    }

    private void cleratxtbox()
    {
    foreach (Control c in groupBox1.Controls)
    {
    if (c is TextBox)
    {
    (c as TextBox).Text = string.Empty;
    }
    }
    }

    private void btndelete_Click(object sender, EventArgs e)
    {
    if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel ectedIndex))
    {
    var command = new SqlCommand("DELETequstion", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
    connection.Open();
    command.ExecuteNonQuery();
    connection.Close();
    frmdefineqestions_Load(null, null);
    MessageBox.Show("حذف شد");
    }
    }

    private void checkedListBox1_DoubleClick(object sender, EventArgs e)
    {
    if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel ectedIndex))
    {
    SqlDataReader reader;
    var command = new SqlCommand("sendqestionforupdate", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
    connection.Open();
    reader = command.ExecuteReader();
    try
    {
    if (reader.Read())
    {
    textBox1.Text = reader["QUSETIONTEXT"].ToString();
    textBox2.Text = reader["CASE1"].ToString();
    textBox3.Text = reader["CASE2"].ToString();
    textBox4.Text = reader["CASE3"].ToString();
    textBox5.Text = reader["CASE4"].ToString();
    }
    connection.Close();
    reader.Close();
    }
    catch (Exception exception)
    {
    MessageBox.Show(exception.Message);
    }
    }
    }

    private void btnedit_Click(object sender, EventArgs e)
    {
    if (checkedListBox1.Items.Count > 0 && checkedListBox1.GetItemChecked(checkedListBox1.Sel ectedIndex))
    {
    SqlDataReader reader;
    var command = new SqlCommand("sendqestionforupdate", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@id", checkedListBox1.SelectedValue);
    connection.Open();
    reader = command.ExecuteReader();
    try
    {
    if (reader.Read())
    {
    textBox1.Text = reader["QUSETIONTEXT"].ToString();
    textBox2.Text = reader["CASE1"].ToString();
    textBox3.Text = reader["CASE2"].ToString();
    textBox4.Text = reader["CASE3"].ToString();
    textBox5.Text = reader["CASE4"].ToString();
    comboBox2.Text = reader["ANSWER"].ToString();
    }
    connection.Close();
    reader.Close();
    }
    catch (Exception exception)
    {
    MessageBox.Show(exception.Message);
    }
    }
    }

    private void btnsaveedit_Click(object sender, EventArgs e)
    {
    var command = new SqlCommand("updatetblqusetion", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@qustinoid", checkedListBox1.SelectedValue);
    command.Parameters.AddWithValue("@QUSETIONTEXT", textBox1.Text);
    command.Parameters.AddWithValue("@CASE1", textBox2.Text);
    command.Parameters.AddWithValue("@CASE2", textBox3.Text);
    command.Parameters.AddWithValue("@CASE3", textBox4.Text);
    command.Parameters.AddWithValue("@CASE4", textBox5.Text);
    command.Parameters.AddWithValue("@ANSWER", comboBox2.Text);
    command.Parameters.AddWithValue("@GROUPID", comboBox1.SelectedValue);
    connection.Open();
    command.ExecuteNonQuery();
    connection.Close();
    frmdefineqestions_Load(null, null);
    MessageBox.Show("سوال ویرایش شد");
    cleratxtbox();
    }
    }
    }

  15. #15
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام مجدد نه من هم این رو به روش شما انجام دادم فقط در فرم سوالات بجای گرید از چکلیست باکس استفاده کردم که تفاوت چندانی نداشت ولی در یک جا از دیتا ریدر استفاده کردم
    سلام.
    بعضی از کارهایی رو که انجام دادید خوب هست (مثل همون foreach ای که باهاش تکست باکس ها رو خالی میکنید).
    ولی بعضی از کارهای دیگه اصلا بهینه نیست و چندین مرتبه یک عمل رو انجام دادید که عملا اضافه کاری هست و باعث کاهش سرعت میشه.
    مثلا در addquestion اومدید و فرم لود رو صدا زدید. ما وقتی سوال رو ویرایش میکنیم فقط به سوال دست زدیم نه به گروه های امتحانی. بنابراین صدا زدن فرم لودی که پر کردن کمبو گروه ها رو انجام میده عملا یک کار اضافی و بیهوده هست (با صدا زدن فرم لود عملا دارید به دیتابیس کانکشن میزنید و دوباره اطلاعات گروه ها رو از دیتابیس میخونید و می ریزید داخل کمبو. در صورتیکه این کار هیچ ضرورتی نداره و فقط یکبار بایستی انجام بشه). (این کار رو در btnsaveedit و btndelete هم انجام دادید).
    مورد بعدی استفاده بی جهت از دیتا ریدر هست.
    گرچه پیاده سازی یک پروژه به روش های متفاوتی انجام میشه و سلیقه برنامه نویس ها در استفاده از اشیای مختلف متفاوت هست ولی به این مورد توجه کنید در اینجا باز هم شکا دارید یک select اضافی رو پیاده سازی میکنید. یک select برای پر کردن چک لیست باکس (معادل همون پر کردن گرید)، و مورد بعدی باز هم اومدید آی دی رو از چک لیست باکس گرفتید و یک select به دیتابیس زدید و اونو با دیتاریدر به تکست باکس ها منتقل کردید که این کار عملا اضافه هست.
    یه توصیه ای بهتون میکنم و اونم اینه تحت هیچ شرایطی عمل اضافی انجام ندید. وصل شدن به دیتابیس و خوندن یکسری اطلاعات و برگشت دادن اون، از منابع سیستم استفاده میشه. اگر قرار باشه در هر فرمی حداقل یک عمل نامناسب (عمل اضافی و غیر ضروری) صورت بگیره در کل پروژه تاثیر خودش رو میذاره.
    بنابراین سعی کنید هیچ قطعه کدی رو اضافی ننویسید.
    همونطور که دیدید من در انتهای ویدئوی چهارم هم عرض کردم که حتی اون FillGrid درون فرم لود هم اضافی هست و بهتره که نوشته نشه (با وجود اینکه فقط یکبار در طول کار کردن با اون فرم اجرا میشد و پردازش سنگینی رو هم در پی نداشت).
    سعی کنید به گونه ای برنامه بنویسید که حداکثر صرفه جویی در منابع سیستم صورت بگیره.

  16. #16
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    با سلام و تشکر از پاسخ تون بله دست و پا شکسته یاد گرفتن این چیزا ها رو داره دیگه!!البته من کلا به روش دیگه ای کار میکنم سعی میکنم مثلا یه تابع به این شکل مینویسم

     public void iud(OleDbCommand cmd)
    {
    cmd.Connection = con;
    con.Open();
    da.SelectCommand = cmd;
    ds.Clear();
    cmd.ExecuteNonQuery();
    con.Close();
    da.Update(ds, "tbbook");
    cmd.Dispose();
    }


    و بعد دستورات رو بهش پاس میدم البته از این موارد تو اون روش هم هست که ان شالله با آموزش های شما و بقیه دوستان و همت خودم اونها رو هم برطرف میکنم
    مجددا از پاسخ گویی و آموزش های خوبتون تشکر میکنم
    موفق باشین

  17. #17

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    سلام ممنون از آموزشاتون
    یه سوال:
    من از stored proc استفاده نمی کنم حالا چطور باید به پارامتری خارجی که تعریف کردم دسترسی داشته باشم؟ ومقدارشو چک کنم
    کاش همه روش ها رو توضیح می دادید .ممنون می شم کد بزارید
    یا علی

  18. #18
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط shahin60 مشاهده تاپیک
    سلام ممنون از آموزشاتون
    یه سوال:
    من از stored proc استفاده نمی کنم حالا چطور باید به پارامتری خارجی که تعریف کردم دسترسی داشته باشم؟ ومقدارشو چک کنم
    کاش همه روش ها رو توضیح می دادید .ممنون می شم کد بزارید
    یا علی
    سلام.
    من متوجه منظور شما نشدم. کاش کاملتر توضیح میدادید.
    وقتی از sp استفاده نمی کنید، چطور پارامتر خروجی دارید؟ (منظورتون رو کامل توضیح بدید).
    کدی رو که نوشتید اینجا قرار بدید تا دربارش بحث کنیم.
    امکانش وجود نداشت که من بخوام همه روش ها رو در یک آموزش قرار بدم. ADO (بصورت کدنویسی مستقیم، با sp، چند لایه نویسی)، linq و EF .
    حداقل بالای 150 ساعت آموزش میخواد. ضمن اینکه تعدد روش ها در یک مجموعه آموزشی باعث سردرگمی مخاطب میشه.
    سعی شده هم افراد مبتدی در نظر گرفته بشه و هم روشی گفته بشه که در آینده بتونن با همین روش کارهای بزرگتری رو انجام بدن.
    به شخصه بهتون پیشنهاد نمیکنم که از کدنویسی مستقیم درون ویژوال استفاده کنید.
    اگر از ADO.Net استفاده میکنید حتما برید سمت استفاده از Stored Procedure ها.
    من قبلا در این باره در یکی از تاپیک ها صحبت کرده بودم ولی اینجا هم قرار میدم تا دوستانی که اون تاپیک رو ندیدن این مورد رو مد نظر داشته باشند :
    بحث Stored Procedure ها یکی از بحث های حرفه ای در بخش کار با دیتابیس هست که 3 ویژگی برتر اون در مقایسه با کدنویسی مستقیم به قرار زیر هست :
    1. Performance بالاتر : در کدنویسی مستقیم،در هر بار و زمانیکه شما یک دستور sql (همون Tsql ) رو از سمت برنامه (مثلا #C) به سمت دیتابیس می فرستید (یک درخواست مثل لیست همه کالاها). برای به سرانجام رسیدن این درخواست بایستی مراحل زیر انجام بشه :
    بعد از انتقال دستور شما (select ، update و ...) از سمت برنامه به سمت سرور (دیتابیس) کارهای زیر هر بار انجام میشه :
    a) در سمت سرور ابتدا از لحاظ syntax چک میشه که آیا این دستور قابلیت اولیه برای اجرا شدن رو داره یا نه.
    b) در صورت صحت مرحله قبل یک Execute Plan برای دستور شما توسط sql server اختصاص داده میشه.
    c) در مرحله بعد دستور مورد نظر کامپایل میشه.
    d) در نهایت دستور در سمت سرور، Run (اجرا) میشه.
    e) بعد از اجرا، نتیجه کوئری به سمت برنامه کاربردی برگشت داده میشه و ما میتونیم نتیجه کار رو مشاهده کنیم.
    اما در Stored Procedure ها مراحل a و b و c یکبار در سمت سرور انجام میشه و این مراحل دیگه برای اون sp تکرار نمیشه. به همین خاطر هست که سرعت Stored procedure ها بیشتر از کدنویسی مستقیم هست (هر چقدر برنامه و کوئری ها پیچیده تر باشه این سرعت بیشتر نمایان میشه).
    در کدنویسی مستقیم :

    execute command.jpg

    در Stored Procedure ها :

    sp execute.jpg

    2. برنامه نویسی modular (ماژولار) : یک SP یکبار نوشته میشه ولی میتونید اون رو بارها در قسمت های مختلف برنامه (با توجه به نیازتون) صدا بزنید بدون اینکه نیازی به نوشتن چندین باره کدها باشه. خوانایی بالاتری رو هم شاهد خواهیم بود.
    3. امنیت بالاتر : شما میتونید کدهای درون یک sp رو رمزنگاری کنید تا کدهای داخل اون قابل مشاهده توسط کاربران نباشه. در این حالت یک کاربر فقط میتونه از اون sp استفاده کنه بدون اینکه دغدغه اینو داشته باشید که به کدهای Tsql شما دسترسی داشته باشه.
    همچنین میشه واسه sp ها سطح دسترسی (مجوز) تعریف کرد که فقط افرادی که ما مشخص می کنیم بتونن به اون sp و کدهای درون اون دسترسی داشته باشند.

  19. #19

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    ممنون از توضیح کامل تون
    با استفاده از sp و dataset چطوری به این پارامتر دسترسی پیدا کنم
    این خطا میگیره:

    int result = 0;

    DataSet1TableAdapters.UserTableAdapter da = new DataSet1TableAdapters.UserTableAdapter();
    DataSet1.UserDataTable dt = new DataSet1.UserDataTable();
    da.Insert(txtName.Text, txtUser.Text, txtPass.Text, 1,result);


    متن خطا:
    can not convert ref int to int

  20. #20
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    با سلام وتشکر از زحماتت جناب ونیز2008
    قسمت Stored Procedure رو من تو اون تایپیک هم خوندم و خیلی هم خوب توضیح دادین ولی یک نکته برام کمی ابهام داشت اونم
    اما در Stored Procedure ها مراحل a و b و c یکبار در سمت سرور انجام میشه و این مراحل دیگه برای اون sp تکرار نمیشه.
    یعنی در حین اجرای برنامه و تا بستنش!!
    یا نه یکبار بروی یک سرور sql و دیگه n بار اجرا؟؟

  21. #21
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط shahin60 مشاهده تاپیک
    ممنون از توضیح کامل تون
    با استفاده از sp و dataset چطوری به این پارامتر دسترسی پیدا کنم
    این خطا میگیره:

    int result = 0;

    DataSet1TableAdapters.UserTableAdapter da = new DataSet1TableAdapters.UserTableAdapter();
    DataSet1.UserDataTable dt = new DataSet1.UserDataTable();
    da.Insert(txtName.Text, txtUser.Text, txtPass.Text, 1,result);


    متن خطا:
    can not convert ref int to int
    روشی رو که شما استفاده می کنید متفاوت هست با اون چیزی که من در این آموزش ها توضیح میدم و سوال شما در چارچوب تاپیک ما نیست.
    شما از TableAdapter ها استفاده می کنید و قصد ارتباط دادن اون با sp ها رو دارید ولی در این آموزش ها ما از این روش استفاده نمی کنیم.
    لطفا سوالتون رو در یک تاپیک مجزا بپرسید تا دوستان شما رو راهنمایی کنن.
    موفق باشید.

  22. #22
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام وتشکر از زحماتت جناب ونیز2008
    قسمت Stored Procedure رو من تو اون تایپیک هم خوندم و خیلی هم خوب توضیح دادین ولی یک نکته برام کمی ابهام داشت اونم

    یعنی در حین اجرای برنامه و تا بستنش!!
    یا نه یکبار بروی یک سرور sql و دیگه n بار اجرا؟؟
    زمانیکه برای بار اول درون برنامه یک sp صدا زده میشه، sql server بعد از syntax check یک plan برای اون sp در Ram (حافظه) ایجاد میکنه و دستور compile میشه. حالا تا زمانیکه این plan در ram باقی باشه دیگه این مراحل چک نمیشه. یعنی اگر 100 بار هم اون sp صدا زده بشه به اون plan موجود در حافظه رجوع میشه و دیگه مراحلی رو که ذکر کردم تکرار نمیشه.
    اساسا" یکی از مواردی که استفاده از sp ها رو توجیه میکنه همین تکرار (فراخوانی)یک دستور sql هست.
    مثلا در پروژه ما، زمانیکه فرم سوالات باز میشه، کاربر به احتمال زیاد چندین بار پشت سر هم قصد داره که سوالاتی رو ذخیره کنه.
    اولین سوال رو که میخواد ثبت کنه (یعنی sp مورد نظر که AddQuestion هست) فراخوانی میشه. چون بار اول هست، برای اون sp یک plan در رم ایجاد میشه و سوال ثبت میشه. حالا زمانیکه میخواد سوال دوم رو ثبت کنه دیگه اون مراحل چک نمیشن چون یک طرح و نقشه (plan) براش وجود داره.
    اما اگر کدنویسی مستقیم باشه برای سوال دوم ، دستور sql مورد نظر دوباره اون مراحل براش چک میشه.

  23. #23
    کاربر تازه وارد
    تاریخ عضویت
    اردیبهشت 1390
    پست
    30

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    ممنون از بابت آموزشها
    سوالی که داشتم در رابطه با این بود که من در طراحی فرم ادمین برای تکست باکس پسورد ، گزینه PasswordChar را * کردم و می خوام زمانی که برای ویرایش و حذف روی آن کلیک میشه به صورت عدد یا حروفی در تکست باکسها نشون داده بشه
    از چه روشی باید استفاده کنم ؟؟؟؟

  24. #24
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط aydingol مشاهده تاپیک
    ممنون از بابت آموزشها
    سوالی که داشتم در رابطه با این بود که من در طراحی فرم ادمین برای تکست باکس پسورد ، گزینه PasswordChar را * کردم و می خوام زمانی که برای ویرایش و حذف روی آن کلیک میشه به صورت عدد یا حروفی در تکست باکسها نشون داده بشه
    از چه روشی باید استفاده کنم ؟؟؟؟
    خیلی راحت میتونید از کدنویسی برای کنترل متن تکست باکس استفاده کنید. مثال زیر رو ببینید :
    if (checkBox1.Checked)
    {
    textBox1.PasswordChar = '*';
    textBox1.Text = "salam";
    }
    else
    {
    textBox1.PasswordChar = '\0';
    textBox1.Text = "salam";
    }


    نقل قول نوشته شده توسط superwise مشاهده تاپیک
    private void button1_Click(object sender, EventArgs e)
    {
    //declare variable
    double dblArea;

    //calculate the area of circle with radius 100
    dblArea = CalculateAreaFromRadius(100);

    //print the results
    MessageBox.Show(dblArea, "Area");
    }
    سلام.
    سوال شما به بحث ما ارتباطی نداره فقط اینو بگم که کلاس مسیج باکس و متد show اون به 21 روش قابل مقداردهی هست که شما خارج از فرمت (قالب) این 21 روش مسیج باکس رو مقدار دهی کردید. (حالتی وجود نداره که مورد اول double باشه و مورد دوم string قبول کنه).
    دوستان لطفا سوالاتی رو که به آموزش ما مرتبط نمیشه در تاپیک های جداگانه مطرح بفرمایید.
    تشکر از همکاری دوستان.

  25. #25
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    با سلام
    اگر ویرایش رو هم به این صورت که یک باکلیک بر روی یک سطر و زدن دکمه ویرایش یک فرم جدید رو نمایش میدادین و بعد با DialogResult نتایج رو برمیگردوندین پیاده سازی میشدقشنگتر بود
    همچنین برای سطح دسترسی اگر در جداول فیلدهایی از نوع bit میگرفتین و برای تعریف سطح دسترسی ازش استفاده میکردین جالبتر و کارامدتر نبود؟؟مثلا اگر ادمین بخواهد به کسی یه اجازه دسترسی بیشتری بده الان بااین روش در زمان اجرا نمیتونه کاری بکنه هرچند که اینجا در این برنامه فقط 2 سطح وجود داره
    موفق باشید

  26. #26
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام
    اگر ویرایش رو هم به این صورت که یک باکلیک بر روی یک سطر و زدن دکمه ویرایش یک فرم جدید رو نمایش میدادین و بعد با DialogResult نتایج رو برمیگردوندین پیاده سازی میشدقشنگتر بود
    سلام دوست من.
    بعضی جاها واقعا سلیقه ای هست و یک برنامه نویس به گونه ای طراحی میکنه که برنامه نویس دیگه اون روش رو نمی پسنده. من چنین تفاوت هایی رو دوست دارم چراکه انسان ها متفاوت به قضایا نگاه میکنند.
    من نظر شخصی خودم (ممکنه اشتباه هم باشه) اینه که تا حد امکان (نه همیشه) بایستی از پاس کردن کاربر از یک فرم به یک فرم جدید اجتناب کرد مگر در حالاتی که واقعا ضروری باشه. من چند نرم افزار نسبتا بزرگ رو که دیدم به همین روش که همه کارها رو در یک فرم انجام میدادن پیاده سازی میکردن. ولی باز هم میگم ممکنه شما نرم افزاری رو ببینید که به روش دیگه ای عملیات ها رو طراحی کرده باشه.
    همچنین برای سطح دسترسی اگر در جداول فیلدهایی از نوع bit میگرفتین و برای تعریف سطح دسترسی ازش استفاده میکردین جالبتر و کارامدتر نبود؟؟مثلا اگر ادمین بخواهد به کسی یه اجازه دسترسی بیشتری بده الان بااین روش در زمان اجرا نمیتونه کاری بکنه هرچند که اینجا در این برنامه فقط 2 سطح وجود داره
    موفق باشید
    در این مورد در طول ویدئو کاملا توضیح دادم که با توجه به اینکه پروزه ما دو نوع سطح دسترسی ساده داره و اینکه ما منوهای زیادی رو نداریم از ساخت جدول برای این کار اجتناب شد. در پروژه هایی که چندین سطح دسترسی وجود داره و تعداد افرادی که با اون نرم افزار کار میکنن زیاد هستن حتما بایستی یه جدول جداگانه برای ذخیره سازی سطح دسترسی اشخاص (یا گروه ها) در نظر گرفت.
    من قبلا در یک تاپیک اینو بصورت کامل توضیح دادم ولی بخاطر اینکه ممکنه افرادی باشند که اون تاپیک رو ندیدن، اون مطالب رو اینجا هم میارم تا افرادی که این تاپیک رو ملاحظه میکنن و از این بابت مشکل دارند بتونن این مورد رو هم یاد بگیرند.
    ------------------------------------------------------------------------------------------------------
    روند کار شما دو مرحله هست. 1: مشخص کردن سطح دسترسی برای هر کاربر 2: اعمال کردن این محدودیتها در هنگام لاگین هر شخص.
    یکی از روش های پیاده سازی میتونه اینطوری باشه:
    روش اول : یک جدول که سطح دسترسی اشخاص رو مشخص میکنه نیاز دارید.ستون های این جدول نام کاربری و تعداد منوها (یا در صورت نیاز زیر منوها) هست. یعنی اگر در برنامه شما 5 منو وجود داره که هر منو هم 3 زیرمنو داره اگر میخواید برحسب منو کاربر رو کنترل (اجازه یا عدم اجازه) کنید باید علاوه بر نام کاربری 5 تا ستون دیگه هم ایجاد کنید و اگر میخواید بر حسب زیر منو کاربر رو کنترل کنید بایستی 5*3 = 15 فیلد ایجاد کنید.
    فیلدها رو از نوع bit در نظر بگیرید (اگر تیک نداشته باشه یعنی false و اجازه دسترسی به اون منو رو نداره).
    روش دیگه میتونه بر حسب سمت شغلی باشه.
    در اینجا دو جدول نیاز هست : جدول اول شبیه جدول بالاست فقط به جای نام کاربری باید سمت شغلی مشخص بشه . و جدول دوم میشه نام کاربری و سمت شغلی. خوبی این روش اینه که یکبار برای هر سمت شغلی، محدودیت ها تعریف میشه و بعد از اون فقط برای یک شخص سمت شغلیش رو مشخص میکنیم. (زمانیکه تعداد کاربران و تعداد منوها(یا زیرمنوها) زیاد باشن، این روش به مراتب به صرفه تر هستش چون فضای به مراتب کمتری گرفته میشه).
    حالا هنگام لاگین ، اگر کاربر یوزر و پسورد رو درست وارد کرد، میرید از جدول سطح دسترسی، رکوردش رو میخونید و بصورت زیر بر روی منوها (یا زیرمنوها) اعمال می کنید(کد زیر برای زیر منو ها هست، در ادامه برای منوها هم کد رو میزارم):
    M00.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M00"].ToString());
    M01.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M01"].ToString());
    M10.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M10"].ToString());
    M11.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M11"].ToString());
    M12.Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M12"].ToString());


    برای غیر فعال کردن منوها هم میتونید از کد زیر استفاده کنید(اگر در جدول برای تعیین سطح دسترسی به جای زیر منو از منو استفاده کردید. مثل همون چیزی که ما در پروژه انجام دادیم و منوها رو غیرفعال میکردیم):
    menuStrip1.Items["M0"].Enabled = Convert.ToBoolean(DtAccessLevel.Rows[0]["M0"].ToString());

    توجه : من برای راحتی کار خودم نام فیلدها و نام منوها در فرم رو یکسان در نظر گرفتم. منظور از M00 یعنی اولین زیرمنو در اولین منو. منو اول من M0 هست و منوی بعدی M1 و ...
    توضیحات بیشتر :
    وقتی یک شخص یوزر و پسورد رو صحیح وارد میکنه، باید برید داخل جدولی که سطح دسترسی رو نگهداری میکنید. اونجا یک select میزنید:
    select * from TblAccessLevel where UserID = @userid

    منظور از userid@ همون نام کاربری صحیح هست که کاربر باهاش لاگین کرده. نتیجه select بالا میشه یک رکورد که میگه وضعیت هر منو برای اون شخص چطوره (True یا False ).
    اگر هم از روش دوم استفاده کردی یعنی دو جدول داری که یکی شامل (کد) سمت شغلی و فیلدهایی به تعداد منوها(یا زیرمنوها) و جدول دوم هم میشه نام کاربری و (کد) سمت شغلی. در این حالت select شما بصورت زیر میشه:
    select * from tbl1 inner join tbl2 on tbl1.JobID = tbl2.JobID where UserID = @userid

    موفق باشید.
    آخرین ویرایش به وسیله veniz2008 : چهارشنبه 20 شهریور 1392 در 17:30 عصر

  27. #27
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

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

  28. #28
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    با سلام و تشکر از پاسخ کامل تون بله قبول دارم که کاربر رو نباید به فرم های مختلف پاس داد ولی این انتخاب ستون رو هدر برای ویرایش خیلی جالب نیست اصلا شما فکر کنید یه کاربری برای بار اول این گرید رو ببینه نمیدونه کجا رو کلیک کنه من اکثرا یه ستون چک باکس میذارم و با اون کار میکنم یا نوع دو ستون از نوع باتن به گرید اضافه میکنم که تو هر سطرهستند یکی حذف یکی ویرایش
    برای حل این مشکل دو راه در تمام نرم افزارها پیاده سازی میشه :
    1. یک متن کوتاه در همون فرم قرار میدن که توضیح مختصری (چکیده ای) از نحوه کار رو نشون میده. مثلا :
    "برای تصحیح یا حذف یک رکورد بر روی ابتدای آن سطر دابل کلیک کنید". اینطوری کاربر متوجه میشه که باید چطوری این کار رو انجام بده.
    ما در پروژه چنین پیغامی رو نذاشتیم (چون من در حین ویدئو این مطلب رو توضیح دادم) ولی حتما باید در یک پروژه واقعی چنین پیغام های کوتاهی ذکر بشه تا کاربر سر درگم نشه.
    2. فایل راهنمای نرم افزار.
    در فایل راهنمایی که همراه نرم افزارها وجود داره بصورت کامل باید نحوه استفاده از قسمت های مختلف یک نرم افزار توضیح داده بشه (معمولا از تصاویر به همراه متن استفاده میشه) که در قسمت آخر این مجموعه آموزشی با استفاده از نرم افزار WinCHM ساخت چنین راهنماهایی هم بصورت کامل توضیح داده میشه.

  29. #29
    کاربر تازه وارد آواتار redflight
    تاریخ عضویت
    تیر 1391
    محل زندگی
    نامعلوم
    پست
    87

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    سلام
    من نمی دونم مشکلم چی بود که با firefox فیلم ها دانلود نمی شد اما الان که با گوگل کروم دانلود کردم خیلی خیلی خوشحالم
    فیلم اول رو دیدم و فکر می کنم 4 تاشو امروز ببنم تا عقب نیفتم
    اما یه سوالی دارم
    راجع به پایگاه داده
    همون طور که گفتین توی فیلم اول پایگاه داده ای که توی خود ویژوال هست رو برای پروژه های کوچیک و دانشجویی مناسبه
    برای پروژه های بزرگ ( خیلی خیلی خیلی بزرگ ) ما باید از خود اس کیو ال 2008 استفاده کنیم خب از چه نوعیش؟ بهترین نوعش اکسپرسه؟

    ببخشید یه سوال دیگه هم دارم فیلم ها رو چند روز یک بار می زارید ؟
    می شه این کارتون رو ادامه بدید؟ آخه واقعا فیلماتون خوبه من با این که یکیشو دیدم اما بی نهایت راضی ام من هزینه فوق العاده زیادی برای سی دی های اموزشی سی شارپ داده بودم و... ولی اینجوری نبودن
    می شه بعد از این دوره هم دوره های دیگه رو ادامه بدید؟
    ممنون

  30. #30
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط redflight مشاهده تاپیک
    همون طور که گفتین توی فیلم اول پایگاه داده ای که توی خود ویژوال هست رو برای پروژه های کوچیک و دانشجویی مناسبه
    برای پروژه های بزرگ ( خیلی خیلی خیلی بزرگ ) ما باید از خود اس کیو ال 2008 استفاده کنیم خب از چه نوعیش؟ بهترین نوعش اکسپرسه؟
    سلام دوست عزیز.
    ببینید ما چندین نوع Sql server داریم که در واقع Engin های sql هستند که هر کدوم از اینها برای موارد خاص خودشون استفاده میشن.
    SQL Server Express Edition
    SQL Server Standard Ediotion
    SQL Server Developer Edition
    SQL Server EnterPrise Edition
    نسخه express رابط گرافیکی (management studio) رو نداره و از لحاظ یکسری امکانات هم محدودیت هایی داره، بسیار کم حجم تر از بقیه نسخه ها هست و البته رایگان هست (مطمئنا چون در ایران زندگی میکنیم کلمه "رایگان" کاملا بی مفهوم هست برای ما).
    یک مدل از sql express هست که رابط گرافیکی هم داره که اصطلاحا" بهش SQL Server Express with Advanced Services گفته میشه. این هم رایگان هست ولی رابط گرافیکی رو هم داره.
    درباره محدودیت های sql express اینو از msdn براتون درآوردم :
    Limitations of SQL Server Express Edition
    1. Number of CPUs supported
    SQL Server Express uses only one CPU at a time. It can be installed on a server with multiple CPUs, but it will use only one CPU at a time.
    2. Maximum memory used
    SQL Server Express uses a maximum of 1 GB memory for it's data buffer. So, if your server has severaql GB memeory, SQL Server Express cannot take advantage of it.
    3. Database size limit
    Maximum database size is limited to 4 GB (log file size is not counted)
    4. Profiler in SQL Server Express
    Profiler tool is not included with SQL Server Express editions.
    5. Job Scheduler
    Job Scheduling service is not available with SQL Server Express.
    6. Import/Export
    Data import and export feature is not available with SQL Server Express.( But can be downloaded as Russell has mentioned)

    از این توضیحات که بگذریم درباره سوالتون برای برنامه نویسان بهترین نسخه، همون SQL Server Developer Edition هست که البته شما می تونید نسخه Standard رو هم نصب کنید.

    ببخشید یه سوال دیگه هم دارم فیلم ها رو چند روز یک بار می زارید ؟
    اگر مشکل خاصی پیش نیاد فیلم ها معمولا هر 3 روز یکبار قرار میگیرن.
    می شه این کارتون رو ادامه بدید؟ آخه واقعا فیلماتون خوبه من با این که یکیشو دیدم اما بی نهایت راضی ام من هزینه فوق العاده زیادی برای سی دی های اموزشی سی شارپ داده بودم و... ولی اینجوری نبودن
    می شه بعد از این دوره هم دوره های دیگه رو ادامه بدید؟
    ممنون
    نظر لطف شماست بابت آموزش ها ولی باور بفرمایید تهیه فیلم آموزشی بسیار وقت گیر و زمانبر هست.
    اینطور نیست که یک camtasia نصب کنم و شروع به ضبط کردن کنم. من حساسیت زیادی رو نسبت به مطالبی که میگم دارم. قبلش ساعت ها مطالعه کردم و از جاهای مختلف و منابع مختلف مطالعه کردم تا مطلبی رو که ارائه میکنم مفید باشه (هر چند اعتقاد دارم که هر کاری باز هم عاری از خطا و اشتباه نیست و ممکنه ایراداتی هم وجود داشته باشه).
    بحث بعدی زمانی هست که بایستی برای تدوین این آموزش ها گذاشت. هر چند که من هیچگونه کار تزئینی برای این مورد انجام ندادم ولی با این وجود باز هم واقعا زمانبر هست ویرایش کردن آموزش هایی که ضبط شده.
    غول بعدی در راه آموزش ها، بحث آپلود کردن ویدئوها هست. اکثر مواقع تا 3 ساعت پای سیستم میمونم تا یک فایل 60 مگی آپلود بشه. همونطور که خودتون هم میدونید آپلود کردن بسیار زمانبرتر از دانلود کردن هست.
    تمام این کارها وقت و انرژی زیادی رو می طلبه که باعث میشه آدم از خیلی از کارها بیفته.
    به این دلایلی که در بالا عرض کردم امکان تهیه آموزش جدید فعلا مقدور نیست و طرح و اندیشه ای هم برای این کار ندارم.
    موفق باشید.

  31. #31
    کاربر تازه وارد آواتار redflight
    تاریخ عضویت
    تیر 1391
    محل زندگی
    نامعلوم
    پست
    87

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    سلام
    خیلی ممنون برای پاسخ جامع
    ببخشید من از کجا بفهمم کدوم sql رو نصب کردم؟

    مثلا اگر برای همین آزمون ساز 4000 تا سوال داشته باشم نسخه استاندارد جواب می ده ؟ ( مثال زدم :دی ) کلا یه جدول اگه 50000 تا مثلا سطر داشته باشه هیچ اتفاق خطرناکی براش نمی افته؟؟

    بدون اغراق می گم فیلم های آموزشی ای که تهیه کردید خیلی جامع است من اگه سی دی های آموزشی ای که خریدم و به اصطلاح بهترین ها بودن ( مقدماتی - متوسط - پیشرفته - سطح حرفه ای یک ، دو ، سه ، چهار ، پینج) البته تا حرفه ای 1 که دیدم پایگاه داده اش اکسس هست هنوز!! رو اگه بشه اینجا بزارم همه دوستان متوجه می شن که من چی میگم
    برای همین خیلی مصر ( moser نمی دونم املاش رو درست نوشتم یا نه) هستم آموزش های شما ادامه داشته باشه حتی اگه مجبور بشین برای وقتی که می زارید آموزش های تجاری ( تولید سی دی های آموزشی) رو راه بندازید من و دوستانم با کمال میل سی دی ها رو تهیه می کنیم فقط خواهش می کنم این آموزش ها رو متوقف نکنین من آموزش دیگه ای نمی تونم پیدا کنم :(

  32. #32
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط redflight مشاهده تاپیک
    ببخشید من از کجا بفهمم کدوم sql رو نصب کردم؟
    خیلی راحت هست. یک new query در محیط sql باز کنید و کد زی رو در اون اجرا کنید :
    print @@version


    version sql.JPG

    مثلا اگر برای همین آزمون ساز 4000 تا سوال داشته باشم نسخه استاندارد جواب می ده ؟ ( مثال زدم :دی ) کلا یه جدول اگه 50000 تا مثلا سطر داشته باشه هیچ اتفاق خطرناکی براش نمی افته؟؟
    با sql شوخی نکنید بدش میاد!.
    الان بحث بر سر میلیون ها رکورد و چند ترابایت اطلاعات هست. SQL بسیار بسیار قدرتمندتر از اون چیزی هست که فکر می کنید.
    این چیزی که گفتید برای نسخه express هم مثل آب خوردن هست چه برسه به نسخه های Standard و Developer .
    اون توضیحاتی که بهتون درباره محدودیت های express دادم رو دوباره بخونید.

    بدون اغراق می گم فیلم های آموزشی ای که تهیه کردید خیلی جامع است من اگه سی دی های آموزشی ای که خریدم و به اصطلاح بهترین ها بودن ( مقدماتی - متوسط - پیشرفته - سطح حرفه ای یک ، دو ، سه ، چهار ، پینج) البته تا حرفه ای 1 که دیدم پایگاه داده اش اکسس هست هنوز!! رو اگه بشه اینجا بزارم همه دوستان متوجه می شن که من چی میگم
    نظر لطف شماست.
    متاسفانه اکثر مجموعه های آموزشی همینطور هستن که شما میگید. بیشتر به فکر پول در آوردن هستن تا آموزش دادن.
    برای همین خیلی مصر ( moser نمی دونم املاش رو درست نوشتم یا نه) هستم آموزش های شما ادامه داشته باشه حتی اگه مجبور بشین برای وقتی که می زارید آموزش های تجاری ( تولید سی دی های آموزشی) رو راه بندازید من و دوستانم با کمال میل سی دی ها رو تهیه می کنیم فقط خواهش می کنم این آموزش ها رو متوقف نکنین من آموزش دیگه ای نمی تونم پیدا کنم :(
    املاش درست بود دوست من (مصر به معنای اصرار کننده هست!)
    پول!!!!!!!!!!!
    پول، شهوت و قدرت 3 چیزی هستن که همیشه وسوسه کننده بودن.
    من هیچگونه نیت مالی و انگیزه اقتصادی از این آموزش ها ندارم و هدفم هم این نیست که با گذاشتن این آموزش ها عده ای رو وسوسه کنم که مثلا برای آموزش های بعدی (در صورت وجود) پول پرداخت کنن.
    گرچه اگر شخصی بابت آموزش هاش پول هم دریافت کنه اساسا" هیچ ایرادی نداره. چراکه بابت تلاش و زحمتش مزد دریافت کرده. مهم اینه آدم به اندازه دانشش پول طلب کنه. به قول شما سی دی بی محتوا نده بیرون و کلی پول هم بگیره.
    این آموزش ها یک شروع هست دوست من.
    هنر شما باید این باشه که روی موضوعات جدید فکر کنید. مطالب جدید رو مطالعه کنید و ایده های جدید داشته باشید. هیچوقت به این چیزهایی که من میگم اکتفا نکنید. بهترین دوست شما کتاب خواهد بود. ویدئو هم مزایای خودش رو داره ولی کتاب یه چیز دیگست.
    نقل قول نوشته شده توسط vahidth مشاهده تاپیک
    سلام اقا من کلا در ارتباط بین جداول مشکل دارم
    میشه بگین کی باید از کلید خارجی استفاده کنیم کلید خارجی میتونه کلید اصلی هم باشه و... کاش یه فیلم هم درباره این مورد میزاشتین.
    اول یه توضیح کتابی میدم بعد با چند مثال توضیح میدم مطلب رو.
    وظیفه کلید خارجی، ارتباط دادن دو جدول با هم هست.
    مثال 1 : سیستم دانشگاه
    جدول دانشجو رو فرض کنید که کلید اصلی اون شماره دانشجویی هست.
    حالا مثلا جدول نمرات رو در نظر بگیر. یا جدول دروس اخذ شده یا جدول "وام های دریافتی" و ...
    ببینید در تمام این جداول باید مشخص بشه که نمره دانشجو چند هست، یا اینکه دانشجو چه درسی رو اخذ کرده و یا دانشجو چه وامی رو گرفته.
    همونطور که می بینید هر 3 تای این جداول به جدول "دانشجو" وابسته هستن. اگر دانشجویی وجود نداشته باشه این جداول بی معنی هستن.
    بنابراین شماره دانشجویی که در این 3 جدول میاد وابسته به همون کلید اصلی جدول دانشجو هست. این همون کلید خارجی هست. ما نمیتونیم (حق نداریم) که شماره دانشجویی رو وارد جدول نمرات(یا جدول وام ها) کنیم که وجود خارجی نداره. در غیر اینصورت صحت و امنیت داده ها زیر سوال میره. پس ارتباط بین جداول از طریق کلید خارجی باعث تضمین ورود مقدار صحیح در جداول وابسته (جدول نمره، جدول وام، جدول دروس اخذ شده) میشه.
    مثال بعدی رو یه فروشگاه ساده در نظر بگیرید.
    یه جدول داریم به نام مشتری ها (customer).
    حالا جدول سفارشات (orders) یا جدول خرید (buy) رو در نظر بگیر.
    در هر دوی این جداول بایستی مشخص بشه که چه مشتری کالا سفارش داده و کدوم مشتری کالا رو خریداری کرده.
    بنابراین شماره مشتری که در این دو جدول میاد وابسته به همون شماره مشتری در جدول مشتری هستن. این فیلد که وظیفه ارتباط بین این دو جدول با جدول مشتری رو داره همون کلید خارجی هست (یادتون نره ما نمیتونیم (و حق نداریم) شماره مشتری رو وارد جدول سفارشات یا جدول خرید کنیم که وجود خارجی نداره).
    یا مثلا در همین مثال فروشگاه ما یک جدول کالا داریم که کلید اصلی اون کد کالا خواهد بود.
    در جدول سفارشات علاوه بر اینکه باید بدونیم چه مشتری سفارش داده باید بدونیم چه کالایی هم سفارش داده. بنابراین نیاز هست که کد کالای مورد نظر هم ثبت بشه. به همین خاطر باید کد کالایی در جدول سفارشات بیاد که در جدول کالا وجود داشته باشه. پس اینجا ما دو کلید خارجی داریم. یکی کد مشتری و دیگری کد کالا (که وابسته به جدول کالا هست).
    در مورد سوالتون که گفتید آیا کلید خارجی میتونه کلید اصلی باشه یا نه.
    بله میتونه ولی به شرایط جدول و پروژه بستگی داره.
    باید انواع رابطه ها بین جداول رو بدونیم.
    1.رابطه یک به یک (مثلا هر کشوری فقط یک پایتخت داره و هر پایتختی هم فقط مال یک کشور هست. یا سیستم ازدواج در همه (یا اکثر) کشورهای دنیا (به جز ایران) : هر مرد فقط میتونه یک زن داشته باشه و هر زنی هم فقط میتونه یک مرد داشته باشه)
    2. رابطه یک به چند (مثلا هر دانشجویی فقط میتونه یک استاد راهنما داشته باشه ولی همون استاد میتونه واسه چندین دانشجو استاد راهنما باشه. یا مثال ازدواج تو ایران : هر زنی فقط میتونه یک شوهر داشته باشه ولی همون شوهر میتونه چندین زن داشته باشه)
    3. رابطه چند به چند (رابطه اخذ درس اینطوری هست. هر دانشجویی میتونه چندین درس اخذ کنه و هر درسی هم میتونه توسط چندین دانشجو اخذ بشه).
    با این توضیحات باید دید که آیا کلید خارجی که در یک جدول میاد چه رابطه ای داره. زمانی میتونید کلید خارجی رو کلید اصلی هم در نظر بگیرید که رابطه یک به یک داشته باشید.
    مثلا در سیستم دانشگاه.
    در جدول نمرات آیا برای هر دانشجویی فقط یک نمره ثبت میشه؟
    جواب نه هست. در جدول نمرات هر دانشجو براش چندین نمره ثبت میشه. پس کلید خارجی نمیتونه کلید اصلی باشه (شماره دانشجویی یک شخص چندین بار تکرار میشه که نقض کننده مفهوم کلید اصلی هست).
    یا در جدول وام ها : آیا برای هر دانشجویی فقط یک وام ثبت میشه؟
    جواب نه هست. یک دانشجو میتونه چندین وام بگیره. بنابراین چون شماره دانشجویی یک شخص در جدول وام (کلید خارجی) چندین بار میتونه تکرار بشه بنابراین اینجا باز هم کلید خارجی نمیتونه کلید اصلی باشه.
    فرض بگیرید (روی صحت جداول خیلی تمرکز نکنید) دو جدول تولد و مرگ داریم.
    قطعا جدول مرگ وابسته به تولد هست چراکه باید چیزی باشه تا نابودی هم برای اون متصور شد.
    اگر در جدول تولد کد اشخاص رو کلید اصلی در نظر بگیریم در جدول مرگ هم هر شخص فقط یکبار میتونه بمیره.
    این یعنی اینکه کد شخصی که در جدول مرگ میاد (کلید خارجی) برای هر شخص فقط یکبار تکرار میشه که در چنین حالتی میشه کلید خارجی رو همون کلید اصلی در نظر گرفت.
    در کل چنین حالتی خیلی کم بوجود میاد چراکه اکثر رابطه ها یک به چند هست.
    در این زمینه حتما کتاب مطالعه کنید. این بحث ها نکات بسیار زیادی دارند که نمیشه در یک تاپیک یا در یک یا چند ویدئو به اون پرداخت.
    آخرین ویرایش به وسیله veniz2008 : شنبه 23 شهریور 1392 در 14:20 عصر

  33. #33
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط redflight مشاهده تاپیک
    ببخشید این پروژه ای که می نویسیم رو آخرش چه جوری باید روی سیستم دیگران منتقل کنیم ؟
    بعد ما sql سیستم خودمون رو توی کد ها نوشتیم server=.... توی سیستم دیگران کانکشن رو وقتی اینجوری بنویسیم مشکلی پیش نمیاد؟!
    در مورد کانکشن بارها و بارها در سایت بحث شده. کاش اول جستجو میکردی دوست عزیز.
    بیاید با کانکشن و server ( سرویس دهنده) منطقی برخورد کنیم. به نظرتون آیا روی یک سیستم دیگه سرویس دهنده ای به نام md2008 وجود داره؟ قطعا نه!.
    باید نامی رو به عنوان instance در جلوی server بنویسیم که وجود خارجی داشته باشه.
    چندین راه وجود داره :
    یکی اینکه روی سیستم مشتری یک sqlexpress که ورژنش حداقل مساوی با ورژنی باشه که باهاش دیتابیس رو روی سیستم خودتون ساختید.
    راه دوم اینه که برای sql server ای که روی سیستم مشتری نصب میکنید یک instance خاص در نظر بگیرید. (مثل همون چیزی که روی سیستم خودتون دارید. مثلا من میتونم روی سیستم مقصد sql ای نصب کنم که نام instance اون md2008 باشه.در اینصورت برنامه بدرستی کار خواهد کرد که البته بسیار بدیهی هم هست).
    راه بعدی اینه که همه instance های موجود بر روی سیستم مشتری رو با کدنویسی بدست بیارید و اونها رو یکی یکی تست کنید که کدوم instance جوابگو هست. این برای حالتی کاربرد داره که معمولا چند نسخه از sql server روی سیستم مقصد نصب هست و میخوایم ببینیم دیتابیس ما با کدوم instance کار میکنه.
    نکته ای که در تمام این روش ها وجود داره اینه که ببینید دیتابیس شما روی کدوم instance نصب شده (Attach شده).
    ساده ترین راه همون راه اول و استفاده از یک sqlexpress هست که در اینصورت کانکشن استرینگ رو میتونید بصورت زیر بنویسید:
    server=.\\SQLEXPRESS;Database=univ;Integrated Security=True

    یادتون نره کد بالا زمانی کار میکنه که دیتابیس روی سیستم مشتری Attach شده باشه. برای اتچ کردن دیتابیس هم روش های زیادی وجود داره. میتونی از اتچ خودکار استفاده کنی یا با دستورات sql دیتابیس رو اتچ کنید.
    یک نمونه از اتچ خودکار و کانکشن استرینگ مربوطه بصورت زیر هست (باید دیتابیس رو در کنار فایل اجرایی برنامه در پوشه bin\debuge قرار بدید):
    Data Source=(local)\\SQLEXPRESS;AttachDbFilename=|DataD  irectory|\MyDatabaseName.mdf;Integrated Security=True

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

  34. #34
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط rezaricky مشاهده تاپیک
    سلام
    من ویدئوی شماره 1 رو دیدم خیلی خوب بود
    یک سوال دارم
    چرا بین جدول ها توی اس کیو ال سرور relatinship ایجاد نکردین ؟
    سلام.
    خوشحالم که ویدئو برای شما مفید بوده.
    همونطور که در انتهای پست اول هم عرض کردم، در بعضی جاها ممکنه مطلبی در اون ویدئو (یا اون لحظه) فراموش بشه که یا در انتهای همون ویدئو یا در ابتدای ویدئوی بعدی اون مطلب گفته میشه.
    حرف شما درباره برقراری ارتباط بین جداول صحیح هست. این کار در ابتدای ویدئوی دوم کامل توضیح داده میشه و ارتباط بین جداول رو در محیط sql برقرار می کنیم.
    از توجه و نکته سنجی شما تشکر میکنم.
    موفق باشید.

  35. #35
    کاربر تازه وارد آواتار redflight
    تاریخ عضویت
    تیر 1391
    محل زندگی
    نامعلوم
    پست
    87

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط veniz2008 مشاهده تاپیک
    در مورد کانکشن بارها و بارها در سایت بحث شده. کاش اول جستجو میکردی دوست عزیز.
    بیاید با کانکشن و server ( سرویس دهنده) منطقی برخورد کنیم. به نظرتون آیا روی یک سیستم دیگه سرویس دهنده ای به نام md2008 وجود داره؟ قطعا نه!.
    باید نامی رو به عنوان instance در جلوی server بنویسیم که وجود خارجی داشته باشه.
    چندین راه وجود داره :
    یکی اینکه روی سیستم مشتری یک sqlexpress که ورژنش حداقل مساوی با ورژنی باشه که باهاش دیتابیس رو روی سیستم خودتون ساختید.
    راه دوم اینه که برای sql server ای که روی سیستم مشتری نصب میکنید یک instance خاص در نظر بگیرید. (مثل همون چیزی که روی سیستم خودتون دارید. مثلا من میتونم روی سیستم مقصد sql ای نصب کنم که نام instance اون md2008 باشه.در اینصورت برنامه بدرستی کار خواهد کرد که البته بسیار بدیهی هم هست).
    راه بعدی اینه که همه instance های موجود بر روی سیستم مشتری رو با کدنویسی بدست بیارید و اونها رو یکی یکی تست کنید که کدوم instance جوابگو هست. این برای حالتی کاربرد داره که معمولا چند نسخه از sql server روی سیستم مقصد نصب هست و میخوایم ببینیم دیتابیس ما با کدوم instance کار میکنه.
    نکته ای که در تمام این روش ها وجود داره اینه که ببینید دیتابیس شما روی کدوم instance نصب شده (Attach شده).
    ساده ترین راه همون راه اول و استفاده از یک sqlexpress هست که در اینصورت کانکشن استرینگ رو میتونید بصورت زیر بنویسید:
    server=.\\SQLEXPRESS;Database=univ;Integrated Security=True

    یادتون نره کد بالا زمانی کار میکنه که دیتابیس روی سیستم مشتری Attach شده باشه. برای اتچ کردن دیتابیس هم روش های زیادی وجود داره. میتونی از اتچ خودکار استفاده کنی یا با دستورات sql دیتابیس رو اتچ کنید.
    یک نمونه از اتچ خودکار و کانکشن استرینگ مربوطه بصورت زیر هست (باید دیتابیس رو در کنار فایل اجرایی برنامه در پوشه bin\debuge قرار بدید):
    Data Source=(local)\\SQLEXPRESS;AttachDbFilename=|DataD  irectory|\MyDatabaseName.mdf;Integrated Security=True

    در این باره خیلی بحث شده که با جستجو به نتیجه خواهید رسید.
    موفق باشید.
    مرسی
    سوال من این بود که اگه من برنامه رو بخوام به کسی بدم و ایشون DB نداشته باشه چی ؟ منظور من این بود
    اما درست میگید من باید اول خوب جستجو کنم بعد سوال کنم
    بازم ببخشید....

  36. #36
    کاربر تازه وارد آواتار redflight
    تاریخ عضویت
    تیر 1391
    محل زندگی
    نامعلوم
    پست
    87

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    سلام
    من یه نسخه از سی دی های آموزشی sql گرفتم توی اون گفته که نسخه SQL Server EnterPrise Edition این فقط روی ویندوز های سرور نصب می شه
    ویندوز من سرور نیست پس چرا روی سیستم من نصب شده؟
    عکس های ضمیمه عکس های ضمیمه

  37. #37
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط redflight مشاهده تاپیک
    مرسی
    سوال من این بود که اگه من برنامه رو بخوام به کسی بدم و ایشون DB نداشته باشه چی ؟ منظور من این بود
    باید sql رو به هر طریقی که میتونید نصب کنید.
    برای sql روی سیستم مشتری هم میتونید از sql express استفاده کنید و یا اینکه نسخه کامل رو نصب کنید (نسخه کامل برای یک سیستم تک کاربره معمولا نیاز نیست و همون express کفایت میکنه).
    اینکه چطور sql رو نصب کنید روش های مختلفی داره. مثل ساخت فایل setup . یا نصب از راه دور یا اینکه شخصا در محل حاضر و اقدام به نصب کنید.

    نقل قول نوشته شده توسط redflight مشاهده تاپیک
    سلام
    من یه نسخه از سی دی های آموزشی sql گرفتم توی اون گفته که نسخه SQL Server EnterPrise Edition این فقط روی ویندوز های سرور نصب می شه
    ویندوز من سرور نیست پس چرا روی سیستم من نصب شده؟
    اینها رو ببینید :
    https://barnamenevis.org/showthread.p...ght=Enterprise
    و
    http://stackoverflow.com/questions/1...006823#1006823
    آخرین ویرایش به وسیله veniz2008 : شنبه 27 مهر 1392 در 01:48 صبح

  38. #38
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    به سلام به دوست و استاد عزیزم ونیز 2008
    من قسمت نه رو تازه دیدم به نظرم اومد این قد اون حلقه های فور و وایل و اون ایف و الس ها و...زیادی شلوغ شده بود و فکر کنم مقداری بر پرفرمنس و کارایی برنامه زیاد جالب نباشه من خودم این قسمت رو با این صورت پیاده کردم
    ما یه دیتا تیبل داریم که سطرهایی رو برگشت داده که در یک گروپ ادی هستن حالا ما به ترتیب اون سطرها هم کاری نداریم که مثلا یکی ایدیش 2 باشه یا صد
    مثلا ده سوال میخوایم به صورت تصادفی انتخاب کنیم یه متد رندوم مینویسیم و چون همیشه دیتا تیبل از سطر صفرم شروع میشه ورودی متد رندوممون رو پارامترش اولش رو صفر و پارامتر دوم تعداد سوال درخواستی منهای یک) تمام بعد چند تا تکس باکس و یک آرایه از جنس اینت تعریف میکنیم و مقادیر تصادفی رو که به سطرهای دیتا تیبل اشاره میکنن از اون میخونیم (سطر دلخواه رو از آرایه میخونیم که مقادیر تصادفی درش ذخیره شده)اگه خواستین در کد منظورم رو نشون میدم کدهام خیلی ساده تر میشه دلیل استفاده ازدستور سلکت با این رو هم متوجه نشدم؟؟؟

  39. #39
    کاربر دائمی
    تاریخ عضویت
    تیر 1389
    محل زندگی
    به جبر روزگار تهران هستم.
    پست
    2,718

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    نقل قول نوشته شده توسط esafb52 مشاهده تاپیک
    به سلام به دوست و استاد عزیزم ونیز 2008
    من قسمت نه رو تازه دیدم به نظرم اومد این قد اون حلقه های فور و وایل و اون ایف و الس ها و...زیادی شلوغ شده بود و فکر کنم مقداری بر پرفرمنس و کارایی برنامه زیاد جالب نباشه من خودم این قسمت رو با این صورت پیاده کردم
    ما یه دیتا تیبل داریم که سطرهایی رو برگشت داده که در یک گروپ ادی هستن حالا ما به ترتیب اون سطرها هم کاری نداریم که مثلا یکی ایدیش 2 باشه یا صد
    مثلا ده سوال میخوایم به صورت تصادفی انتخاب کنیم یه متد رندوم مینویسیم و چون همیشه دیتا تیبل از سطر صفرم شروع میشه ورودی متد رندوممون رو پارامترش اولش رو صفر و پارامتر دوم تعداد سوال درخواستی منهای یک) تمام بعد چند تا تکس باکس و یک آرایه از جنس اینت تعریف میکنیم و مقادیر تصادفی رو که به سطرهای دیتا تیبل اشاره میکنن از اون میخونیم (سطر دلخواه رو از آرایه میخونیم که مقادیر تصادفی درش ذخیره شده)اگه خواستین در کد منظورم رو نشون میدم کدهام خیلی ساده تر میشه دلیل استفاده ازدستور سلکت با این رو هم متوجه نشدم؟؟؟
    سلام دوست من.
    اختیار دارید ما هنوز شاگردیم و داریم یاد می گیریم.
    قصد داشتم تا گذاشتن ویدئوی دهم سکوت کنم و چیزی نگم (محتوای پروژه لو نره ) به همین خاطر اونجا که ویدئو نهم رو گذاشتم گفتم توجه مهم.
    حرف شما کاملا درسته که این روش روش بهینه ای نیست مخصوصا زمانیکه تعداد سوالات زیاد میشه.به همین خاطر هست که در ویدئوی دهم یک روش فوق العاده سریع و بهینه رو معرفی میکنم و هدفم این هست که دوستان فرق بین یک راه غیر بهینه و یک راه بهینه و کارآمد رو کاملا لمس کنن. چراکه تا چیزی به عینه مشاهده نشه آدم نمیتونه کاملا اونو لمس و درک کنه.
    اما در مورد روش شما :
    مقادیر تصادفی که در آرایه ذخیره میشه مهم هست. مشکلی که این روش داره و دلیل اصلی کند شدن هم هست فقط یه چیز هست : تابع رندوم در هر مرحله عددی رو تولید میکنه که ممکنه در مرحله قبلی اون عدد تولید شده باشه. زمانیکه تعداد سوالات زیاد میشه احتمال و درصد تولید این عدد تکراری زیاد میشه که باعث کاهش performance میشه.
    در مورد select IN که پرسیدید بخاطر این هست که id هایی که از حلقه بدست اومده رو از جدول بکشه بیرون. البته راه ساده تری هم وجود داشت و اون هم فیلتر کردن همون دیتاتیبلی هست که کل سوالات داخلش وجود داره ولی قصدم این بود که دوستان با دستور IN هم آشنا بشن.
    خوشحال میشم کدها و روشتون رو بصورت کامل بگید تا بهتر بشه دربارش بحث کنیم.
    آخرین ویرایش به وسیله veniz2008 : چهارشنبه 27 شهریور 1392 در 23:50 عصر

  40. #40
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    کنار یه ساحل خیلی زیبا
    پست
    922

    نقل قول: بررسی سوالات و نظرات "پروژه سی شارپ از ابتدا تا انتها"

    من ابتدا از این کلاس رندوم استفاده کردم
     public static class RndomNumber
    {
    //کلاس اعداد رندوم
    public static int[] GetRandomIndex(int MinValue, int MaxValue)
    {
    List<int> RtnList = new List<int>();
    Random R = new Random();
    int Cnt = 0;
    while (Cnt < MaxValue - MinValue + 1)
    {
    int r = R.Next(MinValue - 1, MaxValue + 1);
    if (BetWeen(r, MinValue, MaxValue) && !RtnList.Contains(r))
    {
    RtnList.Add(r);
    Cnt++;
    }
    }
    return RtnList.ToArray();
    }
    public static bool BetWeen(object MainValue, object Value1, object Value2)
    {
    decimal TmpMainValue = Convert.ToDecimal(MainValue);
    decimal TmpValue1 = Convert.ToDecimal(Value1);
    decimal TmpValue2 = Convert.ToDecimal(Value2);
    return (TmpValue1 <= TmpMainValue && TmpMainValue <= TmpValue2);
    }



    }

    و بعد این طوری ازش استفاده کردم
     //برای دریافت تعداد سوالات و شروع آزمون 
    private void btnShowQestions_Click(object sender, EventArgs e)
    {
    if (string.IsNullOrEmpty(textBox1.Text))
    {
    errorProvider1.SetError(textBox1, "لطفا تعداد سوالات رو وارد نمایید");
    return;
    }
    errorProvider1.Clear();
    int a = Convert.ToInt32(comboBox1.SelectedValue.ToString() );
    Qcount = Convert.ToInt32(textBox1.Text);
    if (db.QuestionCount(a, Qcount, out dt))
    {
    randomQuestion = RndomNumber.GetRandomIndex(0, Qcount - 1);
    timer1.Enabled = true;
    textBox2.Text = dt.Rows[randomQuestion[0]][1].ToString();
    textBox3.Text = dt.Rows[randomQuestion[0]][2].ToString();
    textBox4.Text = dt.Rows[randomQuestion[0]][3].ToString();
    textBox5.Text = dt.Rows[randomQuestion[0]][4].ToString();
    textBox6.Text = dt.Rows[randomQuestion[0]][5].ToString();
    btnShowQestions.Enabled = false;
    }
    else
    {
    MessageBox.Show("این تعداد سوال وجود در این گروه موجود نمی باشد!!");
    }
    }


    و برای رفتن به سوالات بعدی هم
     //...برای رفتن به سوال بعدی که البته هنوز به طور کامل پیاده سازیش نکردم مثلا جواب رو نگرفتم و....
    private void btnnextQuestion_Click(object sender, EventArgs e)
    {
    textBox2.Text = dt.Rows[randomQuestion[randomQuestionindex]][1].ToString();
    textBox3.Text = dt.Rows[randomQuestion[randomQuestionindex]][2].ToString();
    textBox4.Text = dt.Rows[randomQuestion[randomQuestionindex]][3].ToString();
    textBox5.Text = dt.Rows[randomQuestion[randomQuestionindex]][4].ToString();
    textBox6.Text = dt.Rows[randomQuestion[randomQuestionindex]][5].ToString();
    //به علت اینکه محتوای آرایهrandomQuestion به صورت رندم هست کافیست تا فقط بین عناصر اون حرکت کنیم
    randomQuestionindex++;
    if (randomQuestionindex > Qcount)
    {
    MessageBox.Show("اتمام آزمون");
    //نمایش نتایج و انام کارهای دلخواه
    }
    }

    یعنی کد فرمم این طوری هست
    using System;
    using System.Data;
    using System.Windows.Forms;

    namespace MYAZMOON
    {
    public partial class FrmRunExam : Form
    {
    private readonly bal db = new bal();
    private int Qcount;
    private DataTable dt = new DataTable();
    private int m;
    private int[] randomQuestion;
    private int randomQuestionindex = 1;
    private int s;

    public FrmRunExam()
    {
    InitializeComponent();
    }

    private void FrmRunExam_Load(object sender, EventArgs e)
    {
    DataTable dataTable = db.loadqusetiongroup();
    comboBox1.DataSource = dataTable;
    comboBox1.DisplayMember = "GROUPNAME";
    comboBox1.ValueMember = "GROUPID";
    }

    //برای دریافت تعداد سوالات و شروع آزمون
    private void btnShowQestions_Click(object sender, EventArgs e)
    {
    if (string.IsNullOrEmpty(textBox1.Text))
    {
    errorProvider1.SetError(textBox1, "لطفا تعداد سوالات رو وارد نمایید");
    return;
    }
    errorProvider1.Clear();
    int a = Convert.ToInt32(comboBox1.SelectedValue.ToString() );
    Qcount = Convert.ToInt32(textBox1.Text) ;
    if (db.QuestionCount(a, Qcount- 1, out dt))
    {
    //منظور از صفر در اینجا سطر اول دیتا تیبل هست که با صفرشروع میشه
    randomQuestion = RndomNumber.GetRandomIndex(0, Qcount);
    timer1.Enabled = true;
    textBox2.Text = dt.Rows[randomQuestion[0]][1].ToString();
    textBox3.Text = dt.Rows[randomQuestion[0]][2].ToString();
    textBox4.Text = dt.Rows[randomQuestion[0]][3].ToString();
    textBox5.Text = dt.Rows[randomQuestion[0]][4].ToString();
    textBox6.Text = dt.Rows[randomQuestion[0]][5].ToString();
    btnShowQestions.Enabled = false;
    }
    else
    {
    MessageBox.Show("این تعداد سوال وجود در این گروه موجود نمی باشد!!");
    }
    }

    //برای گرفتن نتیجه آزمون
    public int chekresult()
    {
    int result = 0;
    if (radioButton1.Checked)
    {
    result = 1;
    }
    else if (radioButton2.Checked)
    {
    result = 2;
    }
    else if (radioButton3.Checked)
    {
    result = 3;
    }
    else if (radioButton4.Checked)
    {
    result = 4;
    }
    else
    {
    result = 0;
    }
    return result;
    }

    //...برای رفتن به سوال بعدی که البته هنوز به طور کامل پیاده سازیش نکردم مثلا جواب رو نگرفتم و....
    private void btnnextQuestion_Click(object sender, EventArgs e)
    {
    textBox2.Text = dt.Rows[randomQuestion[randomQuestionindex]][1].ToString();
    textBox3.Text = dt.Rows[randomQuestion[randomQuestionindex]][2].ToString();
    textBox4.Text = dt.Rows[randomQuestion[randomQuestionindex]][3].ToString();
    textBox5.Text = dt.Rows[randomQuestion[randomQuestionindex]][4].ToString();
    textBox6.Text = dt.Rows[randomQuestion[randomQuestionindex]][5].ToString();
    //به علت اینکه محتوای آرایهrandomQuestion به صورت رندم هست کافیست تا فقط بین عناصر اون حرکت کنیم
    randomQuestionindex++;
    if (randomQuestionindex > Qcount)
    {
    MessageBox.Show("اتمام آزمون");
    //نمایش نتایج و انام کارهای دلخواه
    }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
    //برای زمان ده دقیقه ای آزمون
    s = Convert.ToInt32(label4.Text);
    m = Convert.ToInt32(label5.Text);
    if (m != 10)
    {
    s++;
    if (s == 60)
    {
    s = 0;
    m++;
    label5.Text = m.ToString("00");
    }
    label4.Text = s.ToString("00");
    }
    else
    {
    timer1.Stop();
    MessageBox.Show("time end");
    MessageBox.Show("اتمام آزمون");
    }
    }
    }
    }

صفحه 1 از 6 123 ... آخرآخر

تاپیک های مشابه

  1. سوال: طراحی انبار " ایجاد، حذف " در سی شارپ
    نوشته شده توسط ahnsolution در بخش C#‎‎
    پاسخ: 7
    آخرین پست: چهارشنبه 03 دی 1393, 07:22 صبح
  2. خبر: آموزش ویدئویی یک پروژه سی شارپ از ابتدا تا انتها
    نوشته شده توسط veniz2008 در بخش C#‎‎
    پاسخ: 16
    آخرین پست: یک شنبه 28 مهر 1392, 17:58 عصر
  3. سوال: نحوه نصب یک پروژه سی شارپ
    نوشته شده توسط b_bahadorani در بخش C#‎‎
    پاسخ: 4
    آخرین پست: جمعه 05 مهر 1387, 01:08 صبح
  4. DataSet.TableName.Rows(0).Item("") در سی شارپ چی میشه؟
    نوشته شده توسط ahnsolution در بخش دسترسی به داده ها (ADO.Net و LINQ و ...)
    پاسخ: 2
    آخرین پست: یک شنبه 20 مرداد 1387, 15:42 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •