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

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

  1. #1

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

    باسلام خدمت اساتید محترم. بنده خیلی گشتم و خیلی سعی کردم که این مشکل رو حل کنم ولی نشد که نشد. مشکل اینجاست که تو فرم اولم 3 تا TextBox دارم که شامل IP و User و Pass میکروتیکی که میخوام بهش وصل بشم هستش. توی فرم های مختلف میخوام به میکروتیک به وسیله این اطلاعاتی که تو فرم اول وارد میکنم، برم و وصل بشم. تا اونجایی که تونستم فقط تو یه فرم میتونم اطلاعات این فرم رو فراخونی کنم. ولی وقتی میخوام از دو فرم یا بیشتر این اطلاعات رو بخونم، برنامه کار نمیکنه و یه صفحه سفید میاره بهم نشون میده. از دوستان کسی هست که بتونه کمکم کنه لطفا؟ اگر لینکی باشه که بتونه بهم کمک کنه هم ازتون ممنون میشم اگه راهنماییم کنین. مرسی
    توضیح اینکه زبان برنامه نویسی بنده WPF هستش.

  2. #2

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

    سلام
    راهکار که زیاد هست منتها قبل اش یه توصیه میکنم که اول زبان سی شارپ تون و بعد کار با 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 استفاده کنید .




  3. #3

    نقل قول: فراخوانی داده های موچود در 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 رو ایراد میگیره و نمیذاره برنامه اجرا بشه. مورد دوم هم کلا دکمه رو بی اثر میکنه عزیز.
    م

  4. #4

    نقل قول: فراخوانی داده های موچود در 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 تا باکسی که تو فرم اولم دارم استفاده کنم یا نه؟؟

  5. #5
    کاربر دائمی
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    ایران
    پست
    370

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

    سلام

    شما سه تا متغیر سراسری global variable برای IP و User و Pass تعریف کن

    در این صورت در تمام فرمها و متدها در دسترس هستند و وابسته به فرم و یا تکست باکس خاصی نیستند.

  6. #6

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

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

  7. #7

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

    سلام شما چندتا راه دارید:
    اول اینکه اطلاعات رو از تکست باکس ها بگیرید و داخل پراپرتی استاتیک ذخیره کنید
    اول یه نوع استاتیک از MainWindow ایجاد کنید
    Public Static MainWindow Instance;

    بعد در متد سازنده InitializeMainWindow کد زیر رو بنویسید
    Instance=this;

    حالا متغیر های استاتیک رو ایجاد کنید

    Public static string IP;
    Public static string Username;
    Public static string Password;

    حالا هرجا نیاز بود مقدار پراپرتی هارو ست کنید
    بعدش میتونید از تمام کلاس ها و ویندو ها دسترسی داشته باشید
    به این صورت:

    MainWindow.Instance.IP
    روش بعدی هم به این صورت هست که شما اطلاعات رو در یک فایل و مسیر مشخص ذخیره کنید و هرجا لازم بود فایل رو بخونید
    روشی هم که اقای خاطی معرعی کردن هم غیر استاندارد و هم پیچیده هستش و اصلا پیشنهاد نمیشه

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

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

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

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