Надсилати значення з однієї форми в іншу


84

Я хочу передавати значення між двома формами (c #). Як я можу це зробити?

У мене є дві форми: Form1 і Form2.

Форма1 містить одну кнопку. Коли я натискаю на цю кнопку, Form2 повинен відкритись, а Form1 повинен знаходитися в неактивному режимі (тобто не можна вибрати).

Form2 містить одне текстове поле та одну кнопку подання. Коли я набираю будь-яке повідомлення у текстовому полі Form2 і натискаю кнопку "Надіслати", Form2 має закритись, а Form1 має виділити подане значення.

Як я можу це зробити? Хтось може допомогти мені зробити це на простому прикладі.


Чи мав ти для цього якийсь приклад?
Міллар

Відповіді:


58

Є кілька рішень для цього, але саме такий шаблон я схильний використовувати.

// Form 1
// inside the button click event
using(Form2 form2 = new Form2()) 
{
    if(form2.ShowDialog() == DialogResult.OK) 
    {
        someControlOnForm1.Text = form2.TheValue;
    }
}

І ...

// Inside Form2
// Create a public property to serve the value
public string TheValue 
{
    get { return someTextBoxOnForm2.Text; }
}

Я вважав, що це погана поведінка кодексу. Тоді це чудово. Я також буду використовувати цей шаблон
CasperT

Ну, я не думаю, що це погана "поведінка", однак існують наслідки для безпеки, які слід врахувати, перш ніж використовувати цей шаблон. (Але, чудовий простий приклад +1)

1
Також не забувайте, що вам також потрібно буде мати form2 замість form2.Close (); використовувати "DialogResult = DialogResult.OK;" або він не виявить, що форму було відкрито.
Burgo855,

39
private void button1_Click(object sender, EventArgs e)
{
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();    
}

 public Form2(string qs)
    {
        InitializeComponent();
        textBox1.Text = qs;

    }

2
я протестував цей код, якщо ми не зателефонуємо конструктору за замовчуванням Form2, public Form2(string qs):this(){}форма буде погано показана.
Рене

Це варіант, яким я користувався, і він у мене спрацював чудово!
Симон

14

Визначте властивість

public static class ControlID {  
    public static string TextData { get; set; }
}

В form2

private void button1_Click(object sender, EventArgs e)
{  
    ControlID.TextData = txtTextData.Text;   
}

Отримання даних у form1таform3

private void button1_Click(object sender, EventArgs e)
{   
    string text=  ControlID.TextData;   
}

6

Після серії боротьби за передачу даних з однієї форми в іншу я нарешті знайшов стабільну відповідь. Це працює як шарм.

Все, що вам потрібно зробити, це оголосити змінну як public static datatype 'variableName'в одній формі і призначити цій змінній значення, яке ви хочете передати іншій формі, і викликати цю змінну в іншій формі, використовуючи безпосередньо ім'я форми ( Не створюйте об'єкт цієї форми як статичні змінні можна отримати безпосередньо ) і отримати доступ до цього значення змінної.

Прикладом такого є,

Форма1

public static int quantity;
quantity=TextBox1.text; \\Value which you want to pass

Form2

TextBox2.Text=Form1.quantity;\\ Data will be placed in TextBox2

3
Проблема цього підходу полягає в тому, що якщо у вас відкрито кілька форм1, вони замінюють значення "кількість". І ваш Form2 отримує значення останнього відкритого Form1.
Arash Aghlara

4

Оголосіть загальнодоступний рядок у form1

public string getdata;

У кнопці form1

form2 frm= new form2();
this.hide();
form2.show();

Щоб надіслати дані, form1ви можете спробувати будь-яку подію та код, наступний за цією подією

form1 frm= new form1();
form1.getdata="some string to be sent to form1";

Тепер після закриття form2та відкриття form1, ви можете використовувати повернуті дані у getdataрядку.


Я і роблю те саме, що запропоновано вами у моїх формах, але проблема, яку я отримую, полягає в тому, що повернене значення не відображається в текстовому полі, якщо я знову натиснув кнопку.
wsDev

3

Я працював над різними проектами winform, і оскільки додатки ускладнюються (більше діалогів та взаємодій між ними), тоді я почав використовувати якусь систему подій, щоб допомогти мені, оскільки управління відкриттям та закриттям вікон вручну буде важко підтримувати та розвивати далі.

Я використовував CAB для своїх додатків, він має систему подій, але у вашому випадку це може бути надмірним :) Ви можете написати власні події для більш простих програм


+1 для подій, вони гарно масштабуються. Але де ви насправді зберігаєте значення? Статичний клас досить простий, але це близько до використання глобальної змінної, він здається ... icky. Чи кожна форма має власну локальну змінну для налаштувань, які стосуються її?

2

оголосити рядок у форматі1 загальнодоступний рядок TextBoxString;

у формі1 клацніть подію додати

private void button1_Click(object sender, EventArgs e)
    {
        Form1 newform = new Form1();
        newform = this;
        this.Hide();
        MySecform = new Form2(ref newform);
        MySecform.Show();
    }

у конструкторі form2

public Form2(ref Form1 form1handel)
    {
        firstformRef = form1handel;
        InitializeComponent();
    }

у формі2 ящик змінної Form1 firstformRef;

private void Submitt_Click(object sender, EventArgs e)
    {
        firstformRef.TextBoxString = textBox1.Text;
        this.Close();
        firstformRef.Show();

    }

Навіщо створювати нову Form1? Чому б не перейти thisдо Form2конструктора?

2

Код Form1:

private void button1_Click(object sender, EventArgs e)
{
            Form2 f2 = new Form2();
            f2.ShowDialog();
            MessageBox.Show("Form1 Message :"+Form2.t.Text); //can put label also in form 1 to show the value got from form2
}

Код Form2:

        public Form2()
        {
            InitializeComponent();
            t = textBox1;                        //Initialize with static textbox
        }
        public static TextBox t=new TextBox();   //make static to get the same value as inserted
        private void button1_Click(object sender, EventArgs e)
        {

            this.Close();

        }

Це працює!


2

У цьому коді ви передаєте текст у Form2. Form2 показує, що текст у textBox1. Користувач вводить новий текст у textBox1 і натискає кнопку подати. Form1 захоплює цей текст і відображає його у текстовому полі на Form1.

public class Form2 : Form
{
    private string oldText;

    public Form2(string newText):this()
    {
        oldText = newText;
        btnSubmit.DialogResult = DialogResult.OK;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        textBox1.Text = oldText;
    }

    public string getText()
    {
        return textBox1.Text;
    }

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            DialogResult = System.Windows.Forms.DialogResult.OK;
        }
    }
}

А це код Form1:

public class Form1:Form
{
    using (Form2 dialogForm = new Form2("old text to show in Form2"))
    {
        DialogResult dr = dialogForm.ShowDialog(this);
        if (dr == DialogResult.OK)
        {
            tbSubmittedText = dialogForm.getText();
        }
        dialogForm.Close();
    }
}

2

Гаразд, так само Form1має текстове поле, перш за все ви повинні встановити це Form1текстове поле загальнодоступним у властивості текстового поля.

Код Форма1:

Public button1_click()
{
    Form2 secondForm = new Form2(this);
    secondForm.Show();
}

Передайте Form1якthis у конструкторі.

Код Form2:

Private Form1 _firstForm;

Public Form2(Form1 firstForm)
{
    _firstForm = firstForm:
}

Public button_click()
{
    _firstForm.textBox.text=label1.text;
    This.Close();
}

Прийшов на цей пост через різницю. На запитання, на яке я відповів. Це переважно, і в сучасній програмі передача основної форми до дитячих форм часто буде корисною. Це повинна бути бажана відповідь imo
Ніко Вальземанн,

1

Ви можете передати як параметр текстове поле Form1, наприклад:

На обробнику стиків форми 1:

private void button2_Click(object sender, EventArgs e)
{
Form2 newWindow = new Form2(textBoxForReturnValue);
newWindow.Show(); 
}

На формі 2

public static TextBox textBox2; // class atribute

public Form2(TextBox textBoxForReturnValue)
{
    textBox2= textBoxForReturnValue;
}

private void btnClose_Click(object sender, EventArgs e)
{

    textBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
    this.Close();
}

1

Конструктори - найкращі способи передачі даних між формами або об’єктами графічного інтерфейсу, які ви можете зробити. У кнопці форми1 ви повинні мати:

Form1.Enable = false;
Form2 f = new Form2();
f.ShowDialog();

У формі 2, коли користувач натискає кнопку, він повинен мати такий код або подібний:

this.Close();
Form1 form = new Form1(textBox1.Text)
form.Show();

Опинившись у завантаженні форми форми 1, ви можете додати код, щоб робити що завгодно, коли отримуєте значення з конструктора.


Дякую. Для мене це має найбільший сенс. Я спробував все інше на цій сторінці, і це єдине, що спрацювало!
Чуд37

0

Як передати значення з форми в іншу форму

1.) Перейдіть до Form2, потім двічі клацніть на ньому. У коді введіть це.

public Form2(string v)
{
  InitializeComponent();
  textBox1.Text = v;
}

2.) Перейдіть до форми1, потім двічі клацніть на ній. У коді введіть це. // На вашій командній кнопці у Form1

private void button1_Click(object sender, EventArgs e)
{
   Form2 F2 = new Form2(textBox1.Text);
   F2.Show();
}

0

Це дуже просто. припустимо, у вас є 2 віконні форми Form1 і Form2, і ви хочете надіслати запис textbox1 з Form1 до Form2 і відобразити цей запис у label1 з Form2; потім у Form2 створіть мітку, назва якої label1, і перейдіть до властивості label1 і встановіть 'Modifiers' = public, а у формі One створіть textBox з ідентифікатором textBox1 та кнопкою імені submit, потім напишіть наступний код при натисканні кнопки

button1_Click(object sender, EventArgs e)
{
  Form2 obj=new Form2();
  obj.label1.text=textBox1.text.ToString();
  obj.show();
}

ось і все ... таким чином ви можете прив’язати запис набору даних до datagridview іншої форми ......


0

Ви можете скористатися іншим підходом, якщо хочете.

  1. Використання System.Action (тут ви просто передаєте функцію основних форм як параметр дочірній формі, як функцію зворотного виклику)
  2. Метод OpenForms (Ви безпосередньо викликаєте одну зі своїх відкритих форм)

Використання System.Action

Ви можете сприймати це як функцію зворотного виклику, передану дочірній формі.

// -------- IN THE MAIN FORM --------

// CALLING THE CHILD FORM IN YOUR CODE LOOKS LIKE THIS
Options frmOptions = new Options(UpdateSettings);
frmOptions.Show();

// YOUR FUNCTION IN THE MAIN FORM TO BE EXECUTED
public void UpdateSettings(string data)
{
   // DO YOUR STUFF HERE
}

// -------- IN THE CHILD FORM --------

Action<string> UpdateSettings = null;

// IN THE CHILD FORMS CONSTRUCTOR
public Options(Action<string> UpdateSettings)
{
    InitializeComponent();
    this.UpdateSettings = UpdateSettings;
}

private void btnUpdate_Click(object sender, EventArgs e)
{
    // CALLING THE CALLBACK FUNCTION
    if (UpdateSettings != null)
        UpdateSettings("some data");
}

Метод OpenForms

Цей спосіб є простим ( 2 рядки ). Але працює лише з відкритими формами. Все, що вам потрібно зробити, це додати ці два рядки туди, де ви хочете передати деякі дані.

Main frmMain = (Main)Application.OpenForms["Main"];
frmMain.UpdateSettings("Some data");

Я відповів на подібне запитання тут


0

Ви можете використовувати це;

Кнопка Form1 клацніть 1

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    this.Hide();
    frm2.Show();
}

І додайте це до Form2

public string info = "";

Кнопка Form21 клацніть

private void button1_Click(object sender, EventArgs e)
{

    info = textBox1.Text;
    this.Hide();
    BeginInvoke(new MethodInvoker(() =>
    {
        Gogo();
    }));
}

public void Gogo()
{
    Form1 frm = new Form1();
    frm.Show();
    frm.Text = info;
}

0

якщо ви зміните властивість модифікатора елемента керування у формі на загальнодоступний, інші форми можуть отримати доступ до цього елемента керування. fe:

    Form2 frm;
    private void Form1_Load(object sender, EventArgs e)
    {
        frm = new Form2();
        frm.Show();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(frm.txtUserName.Text); 
        //txtUserName is a TextBox with Modifiers=Public        
    }

-1

Як щодо використання публічної події

Я б зробив це так.

public class Form2
{
   public event Action<string> SomethingCompleted;

   private void Submit_Click(object sender, EventArgs e)
   {
       SomethingCompleted?.Invoke(txtData.Text);
       this.Close();
   }
}

і зателефонуйте йому з Form1 так.

private void btnOpenForm2_Click(object sender, EventArgs e)
{
    using (var frm = new Form2())
    {
        frm.SomethingCompleted += text => {
            this.txtData.Text = text;
        };

        frm.ShowDialog();
    }
}

Тоді Form1 міг отримати текст із Form2, коли Form2 закрито

Дякую.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.