PDA

View Full Version : سوال: مشکل در انتقال مقدار متغیر



baran1385
شنبه 30 شهریور 1387, 21:59 عصر
سلام
من در یک کلاس دو متد دارم.متد دوم وقتی انجام می شه که متد اول انجام شده باشه .متد اول نتیجه یه سری اعمالی رو در یک متغیر از نوع int قرار میده . متد دوم باید از مقدار این متغیر استفاده کنه . من این متغیر رو سراسری و public تعریف کردم . ولی مقدار این متغیر در متد دوم صفر است و مقدار متد اول به متد دوم منتقل نمیشه . لطفا راهنمایی کنید که این متغیر int به چه صورتی باید تعریف شه ؟

با تشکر

esmartiz_red
شنبه 30 شهریور 1387, 22:48 عصر
خوب دوست من شما دو تا متد دارین چرا با یه دستور return مقدار مورد نظرتون رو از متد اول نمی گیرین و به عنوان پارامتر ورودی به متد دوم نمی دین

baran1385
شنبه 30 شهریور 1387, 22:54 عصر
در برنامه امکان انجام این کار را ندارم . متد من چیز دیگه ای رو return می کنه .

esmartiz_red
شنبه 30 شهریور 1387, 23:01 عصر
حالا که اینکار امکان نداره پس یه لطفی کن کدی که نوشیرو اینجا بذار

baran1385
شنبه 30 شهریور 1387, 23:22 عصر
public partial class allbook : System.Web.UI.Page
{
DataSet ds = new DataSet();
public int numrows;

protected void Page_Load(object sender, EventArgs e)
{

}



protected void ok_Click(object sender, EventArgs e)
{
// DataSet ds = new DataSet();


string group;
BLL.alllbook SLT = new alllbook();

switch (combogorooh.SelectedIndex)
{
case 0:
group = "koodak";
ds = SLT.select(group);
break;
case 1:
group = "computer";
ds = SLT.select(group);
break;
case 2:
group = "adabi";
ds = SLT.select(group);
break;
case 3:
group = "tarikhi";
ds = SLT.select(group);
break;
}
numrows = ds.Tables[0].Rows.Count;



GridView1.DataSource = ds;
GridView1.DataBind();

}





protected void Button1_Click(object sender, EventArgs e)
{
BLL.InsertLS Add_Basket = new BLL.InsertLS();

CheckBox ckb_Add = new CheckBox();
TextBox Supply = new TextBox();




for (int i = 0; i < numrows; i++)
{

ckb_Add = (CheckBox)GridView1.Rows[i].Cells[1].Controls[0];
// ckb_Add.Visible = true;

if (ckb_Add.Checked == true){



Supply = (TextBox)GridView1.Rows[i].Cells[1].Controls[1];




}

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

SMRAH1
شنبه 30 شهریور 1387, 23:56 عصر
در اینگونه مواقع است که می گویند : و خداوند دیباگر را آفرید :لبخندساده:

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

در ضمن در اینگونه مواقع معمولا یا از return تابع دوم استفاده می شود (همانطور که دوستمان esmartiz_red (http://barnamenevis.org/forum/member.php?u=49708) اشاره کرد) یا یک پارامتر را برای این کار به تابع دوم ارسال می کنید تا مقدار مورد نظر را ذخیره کند تا تابع اول از آن استفاده کند.البته این پارامتر باید از کلمه کلیدی ref استفاده کنی یعنی:


static void Main(string[] args)
{
int r;
r = 10;
Console.WriteLine("First : " + r);
Fun1(ref r);
Console.WriteLine("Second : " + r);
Console.ReadKey();
}

static private void Fun1(ref int Prameter)
{
Prameter = 12;
}

seven7777777
یک شنبه 31 شهریور 1387, 00:47 صبح
دوست عزیز
شما باید به چند نکته توجه کنید :
1. اینکه اصلا تابع اول اجرا می شود یا نه ؟
2. اینکه تابع اول در numrows واقعا عددی غیر از صفر قرار می دهد ، شاید اشکال در تابع اول شماست .
3. شما می توانید در تابع دوم نه از یک متغیر سراسری که از خود datagrid1 استفاده کنید ، تا اونجایی که یادم هست خاصیتی داره که تعداد row هاشو برمی گردونه و row های اون با row های ds در تابع اول با مقدار دهی برابر می شود .

baran1385
یک شنبه 31 شهریور 1387, 04:25 صبح
شما می توانید در تابع دوم نه از یک متغیر سراسری که از خود datagrid1 استفاده کنید ، تا اونجایی که یادم هست خاصیتی داره که تعداد row هاشو برمی گردونه و row های اون با row های ds در تابع اول با مقدار دهی برابر می شود

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