Wyślij wartości z jednego formularza do innego formularza


85

Chcę przekazać wartości między dwoma formularzami (C #). Jak mogę to zrobić?

Mam dwa formularze: Form1 i Form2.

Form1 zawiera jeden przycisk. Kiedy kliknę ten przycisk, Form2 powinien się otworzyć, a Form1 powinien być w trybie nieaktywnym (tj. Nie można go wybrać).

Form2 zawiera jedno pole tekstowe i jeden przycisk przesyłania. Kiedy wpiszę jakąkolwiek wiadomość w polu tekstowym Form2 i kliknę przycisk Prześlij, Form2 powinien zostać zamknięty, a Form1 powinien zostać podświetlony z przesłaną wartością.

Jak mogę to zrobić? Czy ktoś może mi w tym pomóc na prostym przykładzie.


Masz na to jakiś przykład?
Millar

Odpowiedzi:


58

Istnieje kilka rozwiązań tego problemu, ale to jest wzór, którego zwykle używam.

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

I...

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

Myślałem, że to złe zachowanie kodeksu. To jest świetne.
Użyję

Cóż, nie uważam, że jest to złe „postępowanie”, jednak przed użyciem tego wzorca należy wziąć pod uwagę konsekwencje dla bezpieczeństwa. (Ale świetny prosty przykład +1)

1
Nie zapominaj również, że będziesz musiał mieć on form2 zamiast form2.Close (); use "DialogResult = DialogResult.OK;" lub nie wykryje, że formularz został otwarty.
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
Przetestowałem ten kod, jeśli nie wywołamy domyślnego konstruktora Form2, public Form2(string qs):this(){}formularz nie będzie dobrze wyświetlany.
odnowienie

To jest opcja, której użyłem i działała dobrze!
Symon

14

Zdefiniuj właściwość

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

w form2

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

Pobieranie danych do form1iform3

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

6

Po serii zmagań o przekazanie danych z jednej formy do drugiej w końcu znalazłem stabilną odpowiedź. Działa jak urok.

Wszystko, co musisz zrobić, to zadeklarować zmienną jako public static datatype 'variableName'w jednej formie i przypisać do tej zmiennej wartość, którą chcesz przekazać do innej postaci i wywołać tę zmienną w innej postaci, używając bezpośrednio nazwy formularza ( nie twórz obiektu tego formularza jako do zmiennych statycznych można uzyskać bezpośredni dostęp ) i uzyskać dostęp do tej wartości zmiennej.

Przykładem jest

Formularz 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
Problem z tym podejściem polega na tym, że jeśli masz otwartych wiele form Form1, zastępują one wartość „quantity”. A Twój Form2 otrzymuje wartość ostatnio otwartego Form1.
Arash Aghlara

4

Zadeklaruj publiczny ciąg w form1

public string getdata;

W przycisku form1

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

Aby wysłać dane form1, możesz wypróbować dowolne zdarzenie i kod następujący w tym zdarzeniu

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

Teraz po zamknięciu form2i otwarciu form1można użyć zwróconych danych w postaci getdataciągu.


Robię to samo, co sugerowałeś w moich formularzach, ale problem, który otrzymuję, polega na tym, że wartość zwracana nie pojawia się w polu tekstowym, dopóki ponownie wcisnę przycisk.
wsDev

3

Pracowałem nad różnymi projektami winform, a ponieważ aplikacje stają się bardziej złożone (więcej okien dialogowych i interakcji między nimi), zacząłem używać jakiegoś systemu zdarzeń, aby mi pomóc, ponieważ zarządzanie ręcznym otwieraniem i zamykaniem okien będzie trudne utrzymywać i dalej rozwijać.

Użyłem CAB do moich aplikacji, ma system zdarzeń, ale w twoim przypadku może to być przesada :) Możesz napisać własne zdarzenia dla prostszych aplikacji


+1 dla wydarzeń, ładnie się skalują. Ale gdzie właściwie przechowujesz wartości? Klasa statyczna jest dość prosta, ale jest blisko użycia zmiennej globalnej, wydaje się ... okropna. Czy każdy formularz ma własną zmienną lokalną dla ustawień, które go dotyczą?

2

zadeklaruj ciąg w publicznym łańcuchu form1 TextBoxString;

w formularzu 1 klik zdarzenie dodaj

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

w konstruktorze form2

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

w skrzynce form2 zmienna Form1 firstformRef;

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

    }

Po co tworzyć nowe Form1? Dlaczego nie przejść thisdo Form2konstruktora?

2

Kod 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
}

Kod 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();

        }

To działa!


2

W tym kodzie przekazujesz tekst do Form2. Form2 pokazuje, że tekst w textBox1. Użytkownik wpisuje nowy tekst do textBox1 i naciska przycisk przesyłania. Form1 pobiera ten tekst i wyświetla go w polu tekstowym na 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;
        }
    }
}

A to jest kod 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

Ok, więc Form1ma pole tekstowe, przede wszystkim musisz ustawić to Form1pole tekstowe jako publiczne we właściwości textbox.

Formularz kodu 1:

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

Podaj Form1jak thisw konstruktorze.

Formularz kodu 2:

Private Form1 _firstForm;

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

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

Przyszedłem do tego posta z powodu różnicy. Pytanie, na które odpowiedziałem. Jest to preferowane, aw nowoczesnym programie często pomocne będzie przekazanie głównej formy do dziecięcych form. To powinna być preferowana odpowiedź imo
Nico Walsemann

1

możesz przekazać jako parametr pole tekstowe Form1, na przykład:

W uchwycie dolnym Form 1:

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

W formularzu 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

Konstruktorzy to najlepsze sposoby przekazywania danych między formularzami lub obiektami Gui. Możesz to zrobić. W formularzu 1 kliknięcie powinieneś mieć:

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

W formularzu 2, gdy użytkownik kliknie przycisk, powinien mieć kod taki lub podobny:

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

Po załadowaniu formularza formularza 1 możesz dodać kod, aby wykonać cokolwiek, tak jak otrzymujesz wartości z konstruktora.


Dzięki. To ma dla mnie największy sens. Wypróbowałem wszystko inne na tej stronie i tylko to działało!
Chud37

0

Jak przekazać wartości z formularza do innego formularza

1.) Idź do Form2, a następnie kliknij dwukrotnie. W kodzie wpisz this.

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

2.) Idź do Form1, a następnie kliknij dwukrotnie. W kodzie wpisz this. // Na twoim przycisku polecenia w Form1

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

0

To jest bardzo proste. załóżmy, że masz 2 okna formularz Form1 i Form2 i chcesz wysłać rekord pola tekstowego1 z Form1 do Form2 i wyświetlić ten rekord w etykiecie1 formularza2; następnie w Form2 utwórz etykietę o nazwie label1 i przejdź do właściwości label1 i ustaw 'Modifiers' = public, a w Form One utwórz TextBox z id textBox1 i przyciskiem do przesyłania nazwy, a następnie napisz następujący kod na zdarzenie kliknięcia przycisku

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

to wszystko ... w ten sposób możesz powiązać rekord zbioru danych z datagridview innego formularza ......


0

Jeśli chcesz, możesz skorzystać z innego podejścia.

  1. Korzystanie z System.Action (tutaj po prostu przekazujesz funkcję formularza głównego jako parametr do formularza podrzędnego, takiego jak funkcja wywołania zwrotnego)
  2. Metoda OpenForms (bezpośrednio wywołujesz jeden z otwartych formularzy)

Korzystanie z System.Action

Możesz o tym myśleć jako o funkcji zwrotnej przekazanej do formularza potomnego.

// -------- 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");
}

Metoda OpenForms

Ta metoda jest łatwa ( 2 linie ). Ale działa tylko z otwartymi formularzami. Wszystko, co musisz zrobić, to dodać te dwie linie, gdziekolwiek chcesz przekazać jakieś dane.

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

I pod warunkiem moją odpowiedź na podobne pytanie tutaj


0

Możesz tego użyć;

Przycisk Form1 1 kliknięcie

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

I dodaj to do Form2

public string info = "";

Przycisk Form2 1 kliknięcie

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

Jeśli zmienisz właściwość modyfikatorów kontrolki w formularzu na publiczną, inne formularze będą miały dostęp do tej kontrolki. 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

Co powiesz na korzystanie z wydarzenia publicznego

Zrobiłbym to w ten sposób.

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

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

i nazwij to z Form1 w ten sposób.

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

        frm.ShowDialog();
    }
}

Następnie Form1 może pobrać tekst z Form2, gdy Form2 jest zamknięty

Dziękuję Ci.


-1
// In form 1
public static string Username = Me;

// In form 2's load block
string _UserName = Form1.Username;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.