PDA

View Full Version : مشکل با out



resident
دوشنبه 06 اسفند 1386, 19:03 عصر
سلام.
من میخوام یک دیتاریدر رو بخونم و محتویاتش رو در یک دیتاتیبل بریزم.برای این کار من میخوام تغییراتی(ریختن مقدار در ستون اون ردیف از دیتاتیبل) که روی هر ردیف از دیتاتیبل درون متدها انجام میشه در خارج از متد هم اعمال بشه.برای همین سطر جدیدی که برای دیتاتیبل ایجاد کردم رو با کلمه کلیدی out به متدها پاس دادم اما error می گیره.
این کدم:



private void select_formulasion(out DataRow dr1)
{
if ((string)dr["name"] == "لعاب")
dr1[3] = code_formulasion;
else
if ((string)dr["name"] == "انگوب")
dr1[4] = code_formulasion;
else
if ((string)dr["name"] == "چاپ1")
dr1[5] = code_formulasion;
else
if ((string)dr["name"] == "چاپ2")
dr1[6] = code_formulasion;
else
if ((string)dr["name"] == "چاپ3")
dr1[7] = code_formulasion;
else
if ((string)dr["name"] == "چاپ4")
dr1[8] = code_formulasion;
else
if ((string)dr["name"] == "چاپ5")
dr1[9] = code_formulasion;

}

//در این متد ،متد select_formulasion فراخوانی شده.
private void new_row(out DataRow dr1)
{
dr1 = dt.NewRow();
dr1[0] = code_nemune;
dr1[1] = (string)dr["rang"];
bool v = (bool)dr["vaziat"];
if (v == true)
dr1[2] = "تائید";
else
dr1[2] = "حذف";
code_formulasion = (string)dr["code_formulasione_mavade_tarkibi"];
select_formulasion(out dr1);

}

این هم error ها:

Use of unassigned out parameter 'dr1'
این ارر از خط چهارم جایی که آبی کردم گرفته میشه.


The out parameter 'dr1' must be assigned to before control leaves the current method

این error هم از خط اول قسمتی که سبز شده گرفته میشه.

لطفا راهنماییم کنید.

Mrs.Net
دوشنبه 06 اسفند 1386, 22:02 عصر
خطای اول: وقتی ار کلمه out استفاده میکنید میشه بصورت تعریف نشده ارسال کرد (کاری که شما انجام دادید) اما دیگه نمیتونید از اون استفاده کنید مگه اینکه تعریفش کنید.
خطای دوم: و آخر تابع حتما چک میشه که به dr1 یک تعریفی داده شده باشه.
پس قبل از استفاده dr1 باید بصورت زیر تعریفش کنید:

dr1 = yourtable.NewRow();
این خط یا میتونه قبل از صدازدن تابع باشه یا داخل تابع در اولین خط
و با این خط خودبخود مشکل دومتون حل میشه.

SabaSabouhi
سه شنبه 07 اسفند 1386, 09:50 صبح
با سلام
این خطا رو وقتى مى‌بینى که در یکى از حالت‌هاى ممکن پارامتر out شما مقداردهى نشده باقى بمونه. چون انتظار مى‌ره که هنگام فراخوانى این رویه حتماً این پارامتر مقداردهى بشه.
دو راه براى حل این مشکل وجود داره یکیش اینه که همونطور که دوستمون گفتن اول رویه‌ى خودت، پارامتر را مقدار دهى کنى. مثلاً: ;dr1 = null
راه دیگه اینه که کنترل کنى که در تمام حالت‌هاى ممکن dr1 مقدار دهى بشه. تو مثالى که فرستادى کافیه بعد از آخرین if یه else dr1 = null اضافه کنى تا در تمام حالت‌ها dr1 مقدار گرفته باشه. ( null هم براى خودش یه مقداریه )

صبا صبوحى

resident
سه شنبه 07 اسفند 1386, 10:00 صبح
Mrs.Net جان ممنون از اینکه وقت گذاشتید و جواب دادید.

خطای اول: وقتی ار کلمه out استفاده میکنید میشه بصورت تعریف نشده ارسال کرد (کاری که شما انجام دادید) اما دیگه نمیتونید از اون استفاده کنید مگه اینکه تعریفش کنید.
چرا تعریف نکردم؟!! تو اولین خط از بدنه تابع new_row ، dr1 رو تعریف کردم.


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

dr1 = yourtable.NewRow();
این خط یا میتونه قبل از صدازدن تابع باشه یا داخل تابع در اولین خط
و با این خط خودبخود مشکل دومتون حل میشه

تعدادی از فیلدهای dr1 در تابع new_row مقداردهی شدن و اگه من در تابع select_formulasion دوباره یک شیء از dr1 ایجاد کنم مقادیر ی که در تابع new_row به اون اختصاص داده شده از بین میره. در حالیکه من نمیخوام اون اطلاعات از بین بره بلکه میخوام مقدار یک فیلد دیگه هم (که در این تابع مشخص میشه) به dr1 اضافه بشه.

کسی راه حلی نداره؟

hassan razavi
سه شنبه 07 اسفند 1386, 10:19 صبح
اول یک DataRow جدید تعریف کنید و فیلدهاش رو هم پر کنید و در آخر پارامترتون که از نوع out هست را با آن مقدار دهی کنید. امیدوارم تونسته باشم مطلب رو درست بیان کنم

resident
سه شنبه 07 اسفند 1386, 10:28 صبح
خانم صبوحی از شما هم ممنونم.


این خطا رو وقتى مى‌بینى که در یکى از حالت‌هاى ممکن پارامتر out شما مقداردهى نشده باقى بمونه. چون انتظار مى‌ره که هنگام فراخوانى این رویه حتماً این پارامتر مقداردهى بشه.
دو راه براى حل این مشکل وجود داره یکیش اینه که همونطور که دوستمون گفتن اول رویه‌ى خودت، پارامتر را مقدار دهى کنى. مثلاً: ;dr1 = null

به همون دلیلی که در پست قبلی گفتم این کار امکان پذیر نیست.چون مقادیر قبلی dr1 از بین میره.

راه دیگه اینه که کنترل کنى که در تمام حالت‌هاى ممکن dr1 مقدار دهى بشه. تو مثالى که فرستادى کافیه بعد از آخرین if یه else dr1 = null اضافه کنى تا در تمام حالت‌ها dr1 مقدار گرفته باشه. ( null هم براى خودش یه مقداریه )

این کار رو هم کردم اما جواب نداد و باز هم همون error های قبلی رو می گیره.

resident
سه شنبه 07 اسفند 1386, 10:36 صبح
جناب رضوی عزیز،از شما هم متشکرم.

اول یک DataRow جدید تعریف کنید
این کار رو در اولین خط متد new_row انجام دادم.

فیلدهاش رو هم پر کنید
بخشی از این کار رو در متد new_row انجام دادم و باید بخشی رو هم در متد select_formulasion انجام بدم.

در آخر پارامترتون که از نوع out هست را با آن مقدار دهی کنید.
با کد


select_formulasion(out dr1);

این کار انجام مشه. درسته؟ کاری غیر از این منظورتونه؟

SabaSabouhi
سه شنبه 07 اسفند 1386, 14:04 عصر
خانم صبوحی از شما هم ممنونم.



به همون دلیلی که در پست قبلی گفتم این کار امکان پذیر نیست.چون مقادیر قبلی dr1 از بین میره.



این کار رو هم کردم اما جواب نداد و باز هم همون error های قبلی رو می گیره.


با سلام
اول این که من خانم صبوحى نیستم، آقاى صبوحى هستم :لبخندساده:

دوم این که اگه قراره این پارامتر از قبل مقدار داشته باشه و مقدارش رو هم ممکنه بخواهى حفظ کنى حتماً باید از ref استفاده کنى و نه از out.

استفاده از out دقیقاً مانند این هست که یک عمل Assignment انجام بدى یعنى این که «حتماً» مقدار جدیدى رو به خودش مى‌گیره و مقدار قبلى از بین مى‌ره.

اگه بجاى out از ref استفاده کنى مشکلت کاملاً حل مى‌شه.

صبا صبوحى