تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 4 از 4

نام تاپيک: return a row

  1. #1
    پروفشنال
    تاريخ عضويت
    Nov 2007
    پست ها
    546

    14 return a row

    بسم الله الرحمن الرحیم
    با سلام
    من در فرم اول فرم دوم رو صدا کردم. در فرم دوم می خوام وقتی روی یه ستون از دیتا گرید کلیک می کنه و دکمه تائید رو می زنه سطر مربوطه به فرم اول برگردانده شود.
    کد مربوطه رو در رویداد دکمه تائید به شکل زیر نوشتم
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ولی خطا می دهد که رویداد کلیک نمی تواند چیزی رو برگرداند
    Error 1 'System.Data.DataRow Store.UserInterfaces.SearchCommodity.btnOk_Click(o bject, System.EventArgs)' has the wrong return type
    کد مربوط به سطر انتخاب شده در دیتا گرید صحیح است؟

  2. #2
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    روش شما اشتباه است، ضمن اینکه تطابقی با معانی و مفاهیم شی گرایی ندارد.

    اولاً پیشنهاد میکنم، تلاش کنید پایه تفکری شی گرایی خودتان را با مطالعات بیشتر ارتقا دهید.

    دوماً پیشنهاد میکنم از یک BindingSource به عنوان DataSource گراید استفاده کنید تا بتوانید بسیار منطقی و قانونی تر سطر انتخاب شده را ردیابی کنید.

    سوماً پیشنهاد میکنم به جای یک DataRow یا DataRowView فقط primarykey سطر انتخاب شده را پس دهید.
    بدلیل آنکه به احتمال غریب به یقین شما از یک DataSet استفاده کرده اید که روی فرم دوم قرار دارد و DataRow متعلق به ان است، پس با بسته شدن و Dispose فرم دوم، نمیتوان روی همچین DataSet ای حساب باز کرد.
    شما فقط primarykey سط انتخابی را برگردانید بعد در فرم اول اگر نیاز داشتید از primarykey به سایر فیلد ها برسید.
    یا حداقل به جای DataRow آرایه ای از فیلدها را برگردانید.

    کد پیشنهادی در فرم دیالوگی دوم:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    کد پیشنهادی در فرم اول
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    شب خوش.

  3. 2 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


  4. #3
    پروفشنال
    تاريخ عضويت
    Nov 2007
    پست ها
    546

    پيش فرض

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

    دوماً پیشنهاد میکنم از یک BindingSource به عنوان DataSource گراید استفاده کنید تا بتوانید بسیار منطقی و قانونی تر سطر انتخاب شده را ردیابی کنید.
    بله همین طور است و به شکل زیر عمل کردم
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    و در تابع GetFilledDataSource مستقیم به بانک وصل می شم و با استفاده از دستورات سلکت و ... دیتا تیبل رو پر می کنم.
    حالا سوالی که از خدمتتون داشتم این که اشکال ای روش چیه؟
    سوماً پیشنهاد میکنم به جای یک DataRow یا DataRowView فقط primarykey سطر انتخاب شده را پس دهید.
    بدلیل آنکه به احتمال غریب به یقین شما از یک DataSet استفاده کرده اید که روی فرم دوم قرار دارد و DataRow متعلق به ان است، پس با بسته شدن و Dispose فرم دوم، نمیتوان روی همچین DataSet ای حساب باز کرد.
    شما فقط primarykey سط انتخابی را برگردانید بعد در فرم اول اگر نیاز داشتید از primarykey به سایر فیلد ها برسید.
    یا حداقل به جای DataRow آرایه ای از فیلدها را برگردانید.
    در فرم دوم dataRow متعلق به سطر انتخاب شده ی دیتا گرید است. چرا با بسته شدن فرم نمی توان روش حساب کرد؟
    با تشکر

  5. #4
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    بابت تاخیر پیش امده عضر خواهی میکنم ...
    حالا سوالی که از خدمتتون داشتم این که اشکال ای روش چیه؟
    منظورتان مورد دوم مورد بحث در پست قبلی من است؟
    تشخیص مقادیر سطر انتخاب شده با گراید یا BindingSource ؟

    کنترلر گراید مسئول جنبه دیداری مقادیر و ارتباط با کاربر است.
    وظیفه اصلی کنترل سطر جاری در یک DataSource در دات نت بر عهده کلاس پایه CurrencyManager است که به کمک واسط ICurrencyManagerProvider در جاهای دیگر به ان ارجاع داده میشود.

    وقتی شما از گراید میخواهید که سطر جاری و کلاً اطلاعات ناوبری رکورد را در اختیار شما قرار دهد، در واقع دارید با دورترین واسته ممکن با CurrencyManager ارتباط برقرار میکنید.

    در حالیکه BindingSource خود طبق پلی مورفیزم شامل واسط ICurrencyManagerProvider میشود.
    این یعنی اتصال به مرکز کنترل ناوبری و اطلاعات مربوطه.
    این خیلی سرراست تر و دقیق تر است.
    شما حتی میتوانید به سادگی دکمه های قبلی و بعدی و اول و اخر قرار دهید و در مقابل متدهای BindingSource.MoveXXX را فراخوانی کنید.

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

    در فرم دوم dataRow متعلق به سطر انتخاب شده ی دیتا گرید است. چرا با بسته شدن فرم نمی توان روش حساب کرد؟
    شی DataRow همواره وابسته به یک DataTable یا DataSet فعال و موجود است.
    در واقع شما هیچگاه نمیتوانید DataRow ای بدون DataTable مالک بسازید.

    بدلیل آنکه اطلاعات در DataTable به جای انکه سطری نگاه داشته و مدیریت شود، به صورت Collection های مجزایی برای هر ستون نگاه داری میشود!
    این روش مزیت هایی دارد که فعلاً جای ان بحث ان نیست.
    در واقع کلاس DataRow فقط حاوی ایندکس سطر مورد نظر است و برای خواندن هر فیلد باید به Collection آن ستون در ایندکس مورد نظر ارجاع دهد.

    یعنی اگر شما منطقاً بخواهید با بسته شدن فرم بیایید DataSet تان را هم خودتان دستی خالی کنید یا حداقل رها کنید تا گاربیج خودکار و با هوشمندی خدمتش برسد، تا حافظه تخصیص داده شده به این هیولای مکنده RAM را آزاد کنید، انگاه کلیه DataRow های شما از دست خواهد رفت، هرچند که اشاره گر فعال انها را از قبل نگاه داشته باشید.

    مگر اینکه در زمان بسته شدن فرم دیالوگ بیخیال DataSet تولید شده باشید و بگذارید همانطور در RAM بماند تا وقتی کارتان با ان یک سطر تمام شد، خودکار گاربیج ان را تشخیص داده و آزاد کند.

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

    که بنظر من این کار از نظر سرعتی خیلی جالب نیست ولی نمیتوان هم گفت ایرادی دارد!

    ضمن اینکه ارتباط داشتن فرم های شما به صورت PrimaryKey اطلاعات مورد نظر میتوان ایده خوب و تمیز و ایزوله شده ای بین بخش های مختلف باشد.

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

    =====

    سرتان را درد نیاورم اگر میخواهید سطر را برگردانید خیلی هم مشکلی ندارد، کافیست در کد بالای به جای یک سول مقدار بازگشتی و متغییر مربوطه و... را همه از نوع سطر دلخواهتان تعریف کنید.
    شب خوش.
    Last edited by _H2_; 05-02-2012 at 01:35.

  6. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •