PDA

View Full Version : مبتدی: سوال در مورد دسترسی به یک object خاص



mmbarname
سه شنبه 26 مهر 1390, 12:14 عصر
سلام.
چجوری میتونم به یک combobox موجود در فرم دیگر دسترسی داشته باشم.:متفکر:

nilmil_nil
سه شنبه 26 مهر 1390, 12:30 عصر
کامبو باکس رو Public کن اونجوری میشه

majidrezaei2007
سه شنبه 26 مهر 1390, 12:34 عصر
باید خاصیت modifires اون کنترل رو public کنی
بعد توی فرم های دیگه که می خوای به اون دسترسی داشته باشی ، از اون فرم که یک instance گرفتی بعد می تونی به اون کنترل دسترسی داشته باشی
مثلا اسم فرمت Form1 هست و یک textbox داری که می خوای بهش دسترسی داشته باشی . بعد از اینکه modifires مربوط به textbox رو publicکردی این رو یک جای دیگه تو برنامه که لازم داری اینو مینویسی

Form1 frm = new Form1();
frm.textbox.text = "test";

:D همین

mmbarname
سه شنبه 26 مهر 1390, 13:17 عصر
من همین کارو کردم ولی جواب نمیده خاصیت modifieمربوط به comboرو به حالت public درآوردم
form frm=new frmstatus();
ولی وقتی مینویسم frm. نام como که تو فرم status هست نمایش داده نمیشه.

Arash_janusV3
سه شنبه 26 مهر 1390, 13:25 عصر
من همین کارو کردم ولی جواب نمیده خاصیت modifieمربوط به comboرو به حالت public درآوردم
form frm=new frmstatus();
ولی وقتی مینویسم frm. نام como که تو فرم status هست نمایش داده نمیشه.
نام فرمی که اینجا نوشتین غلطه


frmstatus F = NEW frmstatus();

mmbarname
سه شنبه 26 مهر 1390, 14:15 عصر
درست شد در این صورت فقط میشه اون object رو مقدار دهی کرد من میخوام به مقداره درون combo دسترسی پیدا کنم که نمیشه.

mmbarname
سه شنبه 26 مهر 1390, 14:47 عصر
کسی نمیدونه؟

Arash_janusV3
سه شنبه 26 مهر 1390, 15:13 عصر
کسی نمیدونه؟
به نظر من کدهای مربوط به combo را بگذارید تا زودتر به نتیجه برسید
و اگر ایرادی در کدهای شما باشه دوستان متوجه اون می شوند و شما را مطلع می سازند

mmbarname
سه شنبه 26 مهر 1390, 15:18 عصر
من در form1 به combo یک مقدار میدم ودر form2 میخوام اون مقدارو نشون بدم
FrmStatus frm = new FrmStatus();
MessageBox.Show(frm.cmbDriver.Text);

wolf_majid
سه شنبه 26 مهر 1390, 15:18 عصر
شما به راحتی با دونستن نام شی مورد نظر می تونید بهش دسترسی داشته باشید بدون اینکه پابلیکش کنید

Form2 frm2 = new Form2();
(frm2.Controls["comboBox1"] as ComboBox).Text="Test";
(frm2.Controls["comboBox1"] as ComboBox).SelectedItem = (frm2.Controls["comboBox1"] as ComboBox).Items[2];
frm2.ShowDialog();

mmbarname
سه شنبه 26 مهر 1390, 15:38 عصر
من هنوز نتونستم
تو کمبو فرم1 10 تا اسم وجود داره میخوام با باز کردن فرم 2 مقدار انتخاب شده در کمبو فرم1 رو نمایش بدم .در فرم 2 نمایش بدم:گریه:

Amir Oveisi
سه شنبه 26 مهر 1390, 16:27 عصر
کامبو باکس رو Public کن اونجوری میشه
چرا public ؟


باید خاصیت modifires اون کنترل رو public کنی
بعد توی فرم های دیگه که می خوای به اون دسترسی داشته باشی ، از اون فرم که یک instance گرفتی بعد می تونی به اون کنترل دسترسی داشته باشی
مثلا اسم فرمت Form1 هست و یک textbox داری که می خوای بهش دسترسی داشته باشی . بعد از اینکه modifires مربوط به textbox رو publicکردی این رو یک جای دیگه تو برنامه که لازم داری اینو مینویسی

Form1 frm = new Form1();
frm.textbox.text = "test";

:D همین
چرا public ؟


شما به راحتی با دونستن نام شی مورد نظر می تونید بهش دسترسی داشته باشید بدون اینکه پابلیکش کنید

Form2 frm2 = new Form2();
(frm2.Controls["comboBox1"] as ComboBox).Text="Test";
(frm2.Controls["comboBox1"] as ComboBox).SelectedItem = (frm2.Controls["comboBox1"] as ComboBox).Items[2];
frm2.ShowDialog();
اگر فرم ۲ از قبل باز بوده باشه چی؟



من هنوز نتونستم
تو کمبو فرم1 10 تا اسم وجود داره میخوام با باز کردن فرم 2 مقدار انتخاب شده در کمبو فرم1 رو نمایش بدم .در فرم 2 نمایش بدم:گریه:

چرا قبل از ایجاد این تاپیک جستجو نکردید؟

F.zeinali
سه شنبه 26 مهر 1390, 17:19 عصر
سلام دوست عزیز
فرض کن شما تو فرم 1 یک CombpBox داری و می خوای با زدن Button اطلاعاتش ریخته بشه داخل CombpBoxای که در فرم 2 هستش

ابتدا در فرم 2 اینو بنویس

public Form2(string[] Text)
{
InitializeComponent();

comboBox1.Items.AddRange(Text);
}



حالا در فرم 1 بنویس

private void button1_Click(object sender, EventArgs e)
{
string[] arrcom =new string[comboBox1.Items.Count];
for (int i = 0; i < comboBox1.Items.Count; i++)
{
arrcom[i] = comboBox1.Items[i].ToString();

}

Form2 f2 = new Form2(arrcom);
f2.Show();
}


موفق باشی.

wolf_majid
سه شنبه 26 مهر 1390, 18:03 عصر
اگر فرم ۲ از قبل باز بوده باشه چی؟

:لبخند:

حالا درست شد ؟
Form2 frm2 = new Form2();
frm2.Show();
foreach (Form frm in Application.OpenForms)
{
if (frm is Form2)
(frm).Controls["comboBox1"].Text = ":D";
}

فکر کنم بهترین روش همون ارسال رخداد باشه , درسته ؟

Amir Oveisi
سه شنبه 26 مهر 1390, 19:03 عصر
(Application.OpenForms["yourOpenFormName"] as YourOpenFormClassName).Controls["YourComboboxName"] as ComboBox
با این فرض که اسم کلاس فرم دوم YourOpenFormClassName و مقدار Name اش YourOpenFormName است.

Amir Oveisi
سه شنبه 26 مهر 1390, 19:07 عصر
سلام دوست عزیز
فرض کن شما تو فرم 1 یک CombpBox داری و می خوای با زدن Button اطلاعاتش ریخته بشه داخل CombpBoxای که در فرم 2 هستش

ابتدا در فرم 2 اینو بنویس

public Form2(string[] Text)
{
InitializeComponent();

comboBox1.Items.AddRange(Text);
}



حالا در فرم 1 بنویس

private void button1_Click(object sender, EventArgs e)
{
string[] arrcom =new string[comboBox1.Items.Count];
for (int i = 0; i < comboBox1.Items.Count; i++)
{
arrcom[i] = comboBox1.Items[i].ToString();

}

Form2 f2 = new Form2(arrcom);
f2.Show();
}


موفق باشی.

این روش شما درسته ولی آیا به نظرتون محدودیت ایجاد نمی کنه؟

wolf_majid
سه شنبه 26 مهر 1390, 19:25 عصر
(Application.OpenForms["yourOpenFormName"] as YourOpenFormClassName).Controls["YourComboboxName"] as ComboBox
با این فرض که اسم کلاس فرم دوم YourOpenFormClassName و مقدار Name اش YourOpenFormName است.

این رو تست کرده بودم . فقط فرم اول باز شده از نوع فرم2 رو مقدارش را تغییر میده
تست کنید
Form2 frm2 = new Form2();
frm2.Name = "frmTest";
frm2.Show();
((Application.OpenForms["frmTest"] as Form2).Controls["comboBox1"] as ComboBox).Text = ":d";

البته من از روش delegate و event استفاده می کنم

wolf_majid
سه شنبه 26 مهر 1390, 20:04 عصر
روش مورد استفاده من برای انجام چنین کاری :

1- تعریف کلاس زیر :

public class MoveObjectEventArgs : EventArgs
{
/// <summary>
///
/// </summary>
/// <param name="obj">موضوع ارسالی</param>
public MoveObjectEventArgs(object obj)
{
_object = obj;
}

/// <summary>
/// شی مورد انتقال
/// </summary>
private object _object;

/// <summary>
/// شی ذخیره شده را بر می گرداند
/// </summary>
public object GetObject
{
get { return _object; }
}
}

2- تعریف یک رخداد و صدا زدن آن در فرم فرستنده :

public delegate void _SendObject(object sender, MoveObjectEventArgs e);
public event _SendObject SendObject;
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Name = "frmTest";
if (SendObject != null)
SendObject(this, new MoveObjectEventArgs(":D"));
frm2.Show();

3- انجام تغییرات در فرم گیرنده :

public Form2()
{
InitializeComponent();
(Application.OpenForms["Form1"] as Form1).SendObject += getObject;
}
private void getObject(object sender, MoveObjectEventArgs e)
{
comboBox1.Text = (e.GetObject as string);
}

Amir Oveisi
سه شنبه 26 مهر 1390, 22:20 عصر
این رو تست کرده بودم . فقط فرم اول باز شده از نوع فرم2 رو مقدارش را تغییر میده
تست کنید
Form2 frm2 = new Form2();
frm2.Name = "frmTest";
frm2.Show();
((Application.OpenForms["frmTest"] as Form2).Controls["comboBox1"] as ComboBox).Text = ":d";

البته من از روش delegate و event استفاده می کنم

کلا نگرفتم منظورتونو

Amir Oveisi
سه شنبه 26 مهر 1390, 22:24 عصر
روش مورد استفاده من برای انجام چنین کاری :

1- تعریف کلاس زیر :

public class MoveObjectEventArgs : EventArgs
{
/// <summary>
///
/// </summary>
/// <param name="obj">موضوع ارسالی</param>
public MoveObjectEventArgs(object obj)
{
_object = obj;
}

/// <summary>
/// شی مورد انتقال
/// </summary>
private object _object;

/// <summary>
/// شی ذخیره شده را بر می گرداند
/// </summary>
public object GetObject
{
get { return _object; }
}
}

2- تعریف یک رخداد و صدا زدن آن در فرم فرستنده :

public delegate void _SendObject(object sender, MoveObjectEventArgs e);
public event _SendObject SendObject;
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Name = "frmTest";
if (SendObject != null)
SendObject(this, new MoveObjectEventArgs(":D"));
frm2.Show();

3- انجام تغییرات در فرم گیرنده :

public Form2()
{
InitializeComponent();
(Application.OpenForms["Form1"] as Form1).SendObject += getObject;
}
private void getObject(object sender, MoveObjectEventArgs e)
{
comboBox1.Text = (e.GetObject as string);
}

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

F.zeinali
سه شنبه 26 مهر 1390, 22:38 عصر
این روش شما درسته ولی آیا به نظرتون محدودیت ایجاد نمی کنه؟
سلام

من اینجا یه constructor ایجاد کردم و فکر نمی کنم محدودیت ایجاد بکنه!!من می تونم به هر تعداد که لازم بود constructor بسازم و OverLoadهای Form رو بیشتر کنم.
آیا به نظر شما این محدودیت هستش؟؟
خوشحال میشم نظرتون رو بدونم.

wolf_majid
سه شنبه 26 مهر 1390, 22:54 عصر
کلا نگرفتم منظورتونو

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

Amir Oveisi
سه شنبه 26 مهر 1390, 23:01 عصر
محدودیت اول:‌ حتما باید یک instance جدید از فرم مورد نظر بسازید تا بتونین داده مورد نظرتون رو ارسال کنید بهش. اگر قبلا یک instance از فرم مورد نظر وجود داشته باشه آیا بدون اینکه یک instance جدید ازش بسازید میتونین از این روش استفاده کنید؟
محدودیت دوم: آیا برای ارسال هر نوع داده ای قراره یک overload‌ جدا برای سازنده ایجاد بشه؟
محدودیت سوم: آیا برای ارسال داده به هر کنترل در فرم مقصد باید یک overload‌ جدید برای سازنده ایجاد بشه؟

wolf_majid
سه شنبه 26 مهر 1390, 23:02 عصر
این روش شما هنوز مشکل این که اگر فرم هدف در حال حاضر باز باشه رو حل نکرده. در ضمن این روش به نظر شما چه مزیتی نسبت به ارسال داده از طریق سازنده داره که در پست های قبلی ارسال شده بود؟

حالا من منظور شما رو درست نگرفتم :لبخند:


این روش شما هنوز مشکل این که اگر فرم هدف در حال حاضر باز باشه رو حل نکرده
یعنی چی؟
اصلا" تستش کردید ؟
هر تعداد که میخواد از فرم هدف باز باشه بازم جواب میده ( تست کردم )


در ضمن این روش به نظر شما چه مزیتی نسبت به ارسال داده از طریق سازنده داره که در پست های قبلی ارسال شده بود؟
فکر کنم اگر تستش کنید متوجه بشید
ببینید تا جایی که من متوجه شدم توی حالت ارسال داده باید چک می کردیم که آیا داده ارسال شده یا خیر , فرستنده و گیرنده کدومند که توی حالت پویا یک کمی سخت میشد
البته من هم تازه از این روش استفاده می کنم ولی به نظرم خیلی قدرت مانورش به روش های دیگه بیشتره مثل همین که میدونیم فرستنده داده کدوم شی ئه

Amir Oveisi
سه شنبه 26 مهر 1390, 23:05 عصر
اگر بیش از یک نمونه از یک فرم بسازید با روشی که شما گفتید فقط نمونه اول مقداردهی میشه

یک سناریو بگید که توش نیاز باشه از یک فرم دو تا instance وجود داشته باشه در یک لحظه

wolf_majid
سه شنبه 26 مهر 1390, 23:12 عصر
یک سناریو بگید که توش نیاز باشه از یک فرم دو تا instance وجود داشته باشه در یک لحظه

من منظور شما رو از "اگر فرم ۲ از قبل باز بوده باشه چی؟" بد گرفتم

حق با شماست