نمایش نتایج 1 تا 8 از 8

نام تاپیک: فراخوانی داده های موچود در textbox در چندین فرم دیگر

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    نقل قول: فراخوانی داده های موچود در textbox در چندین فرم دیگر

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    سلام
    راهکار که زیاد هست منتها قبل اش یه توصیه میکنم که اول زبان سی شارپ تون و بعد کار با wpf تون را کاملا تقویت کنید وگرنه در بسیاری موارد ، هر بار به مشکلات زیادی برمیخورید که حل کردنش براتون سخت و پیچیده میشه .

    چند راه وجود داره :
    1) یکی اش اینه که در xaml ، فرضا یه ویندوزی با نوع MainWindow دارید که یه شی کنترل TextBox داره . این شی کنترل را ، هم براش directive ئه x:Name تعیین کنید و به این ترتیب یه نام ای دلخواه (فرضا نام UserNameTextBox را براش انتخاب میکنید) به این کنترل بدید و همچنین directive ئه x:FieldModifier را براش تعریف کنید و فرضا مقدار Public را بهش بدید تا از کلاس های دیگه ، در دسترس باشه :


    <TextBox x:FieldModifier="public" x:Name="UserNameTextBox" />


    دقت کنید که با پروپرتیِ Name ، نباید بهش مقدار بدید . حتما باید با x:Name ، بهش مقدار بدید چون میخواید در کنترل دیگه ای قابل دسترس باشه .

    بعد ، درون ویندوز دیگه (فرضا نوع این ویندوز ، OtherWindows هست) (یا user control یا ...) ، همین کار را برای کنترل مقصدی که میخواین این اطلاعات در اون کنترل هم نمایش داده بشه (یا فقط استفاده بشه) ، همین کار را میکنید . یعنی فرضا در ویندوزِ OtherWindows ، یه شی کنترل دکمه (فرضا با نام DisplayButton) میسازید که میخواید محتواش ، همون محتوای TextBox تون بشه ، در این کنترل دکمه ، هم x:FieldModifier و هم x:Name اش را مثل بالا ، تعیین میکنید .

    بعد ، وقتی از درون MainWindow یا رویدادی از کنترلی در این ویندوز ، از ویندوزِ OtherWindows ، شی میسازید تا نمایشش بدید ، قبل از نمایش دادن ، مقدار DataContext ئه دکمه ای که میخواین اطلاعات را در اون نمایش بدید (DataContext ئه DisplayButton) را برابر با مقدار TextBox ئه مورد نظر (UserNameTextBox) قرار بدید .
    یعنی فرضا در رویداد دکمه ای که درون MainWindow قرار داره و توش میخوان شی ای از OtherWindow بسازین :


    private void Button_Click(object sender, RoutedEventArgs e)
    {
    OtherWindows otherWindow = new OtherWindows();
    otherWindow.DisplayButton.DataContext = this.UserNameTextBox;
    otherWindow.Show();
    }


    بعد ، هر پروپرتی ای از DisplayButton (که در پنجره ی OtherWindow هست) را که خواستین (فرضا پروپرتی Content ئه این دکمه) را Binding کنید به پروپرتیِ مورد نظر در TextBox ای که در پنجره ی MainWindow هست (فرضا Binding را به پروپرتیِ Text ئه UserNameTextBox انجام میدید) :


    <Button x:Name="DisplayButton" x:FieldModifier="public" Content="{Binding Path=Text}"/>


    -------

    ** دقت کنید که در خط زیر در کد بالا :


    otherWindow.DisplayButton.DataContext = this.UserNameTextBox;


    ، نباید مقدار DataContext را برابر با شیِ MainWindow بگیرید . یعنی نباید این طور بنویسید :


    otherWindow.DisplayButton.DataContext = this;


    تا بعدش ، نباید کد Binding ئه DisplayButton را این طور تغییر بدید :


    <Button x:Name="DisplayButton" x:FieldModifier="public" Content="{Binding Path=UserNameTextBox.Text}"/>


    ** چون تا جایی که میدونم ، در آدرسِ Path ئه Binding ، همه ی اشیایی که میدید ، باید از پروپرتی باشن اما در کد بالا ، UserNameTextBox ای که در Path ئه Binding دادیم ، یک فیلد هست و پروپرتی نیست . واسه همین ، این کد بالا ، اشکال داره .

    ** یا میتونید بجای Binding به پروپرتی DisplayButton و کلا استفاده از Button ، یه پروپرتی دیگه خودتون در کلاس OtherWindow تعریف کنید (حتما DipendencyProperty باشه) و به این پروپرتی ، Binding انجام بدید (که اصولی ترش ، اینه) .

    ==========

    2) روش دوم و حتی راحت تر (که در WinForm هم رایج هست) اینه که یه عضوی درون OtherWindow تعریف کنید و موقعی که شی ای از این در رویدادی در MainWindow دارید میسازید ، به اون عضو ، مقدارِ Text ئه TextBox را ارسال کنید :


    private void Button_Click(object sender, RoutedEventArgs e)
    {
    OtherWindows otherWindow = new OtherWindows();
    otherWindow.UserNameString = this.UserNameTextBox.Text;
    otherWindow.Show();
    }


    که UserNameString ، عضوی تعریف شده در پنجره ی OtherWindows و از نوع string هست .
    اما توی wpf بهتره که از روش binding استفاده کنید .
    سلام مهندس جان وقت بخیر. ممنونم که این همه وقت گذاشتین و کامل توضیح دادین.
    بله دقیقا درست میفرمایید. من قرار نبود این برنامه رو این همه پیش ببرمش. خیلی برنامه پیچیده شده ولی خب دیگه آخراشه و اگه این دو موردی که مشکل دارم رو حل کنم، برنامه تموم میشه کلا.
    اوامری که فرمودین رو انجام دادم ولی متاسفانه جواب نتونستم بگیرم. در کل اولتون، DataContext رو ایراد میگیره و نمیذاره برنامه اجرا بشه. مورد دوم هم کلا دکمه رو بی اثر میکنه عزیز.
    م

  2. #2

    نقل قول: فراخوانی داده های موچود در textbox در چندین فرم دیگر

    نقل قول نوشته شده توسط مهدی مرادی مشاهده تاپیک
    سلام مهندس جان وقت بخیر. ممنونم که این همه وقت گذاشتین و کامل توضیح دادین.
    بله دقیقا درست میفرمایید. من قرار نبود این برنامه رو این همه پیش ببرمش. خیلی برنامه پیچیده شده ولی خب دیگه آخراشه و اگه این دو موردی که مشکل دارم رو حل کنم، برنامه تموم میشه کلا.
    اوامری که فرمودین رو انجام دادم ولی متاسفانه جواب نتونستم بگیرم. در کل اولتون، DataContext رو ایراد میگیره و نمیذاره برنامه اجرا بشه. مورد دوم هم کلا دکمه رو بی اثر میکنه عزیز.
    م
    سلام وقت بخیر. خوشبختانه مشکل حل شد. با استفاده از این کد در صفحه اولی که اون TextBox وجود داشت:
    Window2 frm2 = new Window2(TXT100.Text, TXT101.Text, TXT102.Text);

    frm2.ShowDialog();

    و کدی که در صفحه ای که میخواستم این اطلاعات به اونجا ارسال بشه:
    public Window2(string ip, string user, string pass)        {
    InitializeComponent();
    try
    {
    using (ITikConnection connection = ConnectionFactory.CreateConnection(TikConnectionTy pe.Api))
    {
    Debug.WriteLine("start");
    connection.OnReadRow += Connection_OnReadRow;
    connection.OnWriteRow += Connection_OnWriteRow;
    connection.Open(ip, user, pass);
    var cmd = connection.CreateCommandAndParameters("/interface/print");
    var list = cmd.LoadList<InterfaceEthernet>();
    COM1.Items.Clear();
    COM2.Items.Clear();
    COM3.Items.Clear();
    foreach (var item in list)
    {
    COM1.Items.Add($"{item.Name}");
    COM2.Items.Add($"{item.Name}");
    COM3.Items.Add($"{item.Name}");
    }
    Console.WriteLine("Identity: " + /*identity.GetResponseField("name")*/ list);
    Debug.WriteLine("Count=" + list);
    Console.WriteLine("Press ENTER");
    Console.ReadLine();
    Debug.WriteLine("end");
    }
    }
    catch (Exception error)
    {
    Debug.WriteLine(error.Message);
    }
    }


    مشکل ارسال اطلاعات حل شد. ولی بازم همچنان مشکل به وجود میاد. اونم اینه که اولا تو هر صفحه ای که میخوام از این اطلاعات استفاده کنم، بعد از زدن دکمه صفحه اول، اون صفحه ها یکی یکی باز میشه که من اینو نمیخوام که اونم بخاطر استفاده از کد ShowDialog هستش که فعلا نمیدونم چجوری باید این مورد رو حل کنم و نذارم که صفحه ها باز بشه. و مشکل بزرگتر اینه که از این اطلاعات تو جاهای دیگه فرم های دیگه نمیتونم استفاده کنم که فعلا دارم در مورد singleton-design-patterns میخونم تا ببینم میتونم این مشکل رو حل کنم و بتونم تو هرجایی از فرم های دیگه از این 3 تا باکسی که تو فرم اولم دارم استفاده کنم یا نه؟؟

  3. #3

    نقل قول: فراخوانی داده های موچود در textbox در چندین فرم دیگر

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

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

  1. پاسخ: 3
    آخرین پست: سه شنبه 17 تیر 1393, 17:27 عصر
  2. پاسخ: 7
    آخرین پست: یک شنبه 10 فروردین 1393, 23:38 عصر
  3. تغییر زبان textbox / حرکت بین textbox با دکمه enter / فهمیدن اینکه الان کدام دکمه فشرده شده است
    نوشته شده توسط fafa_na در بخش JavaScript و Framework های مبتنی بر آن
    پاسخ: 0
    آخرین پست: شنبه 17 تیر 1391, 09:06 صبح
  4. پاسخ: 3
    آخرین پست: پنج شنبه 07 مرداد 1389, 18:04 عصر

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

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