Ahsan98 Ответов: 5

Как использовать несколько форм в c#.


Я хочу создать проект который содержит в себе две формы но вот в чем проблема у меня нет ни малейших знаний об использовании нескольких форм поэтому пожалуйста помогите me...........my проект будет выглядеть так: сначала появляется форма 1, которая спрашивает ваше имя, а затем после ввода имени и нажатия кнопки появляется вторая форма, а первая закрывается..........




Заранее спасибо..........


С уважением,
Ахсан Навид

5 Ответов

Рейтинг:
42

OriginalGriff

Не закрывайте первую форму - когда вы это делаете, она закрывает приложение.

Самый простой способ сделать это-скрыть текущую форму, а затем показать новую:

MySecondForm f = new MySecondForm();
Hide();
f.ShowDialog();
Close();
Это скрывает текущую форму, отображает новую, а затем закрывает основную форму (и, следовательно, приложение), когда новая форма закрывается.


Member 13831327

я хочу добавить две формы в одно решение в рамках одного проекта ,,, но после того, как я разработал первую форму, она работает и работает должным образом, но после добавления и разработки новой формы к существующему решению я не могу запустить вторую форму ., чтобы проверить, работает ли она или нет ..пожалуйста, дайте решение

OriginalGriff

Поэтому покажите нам код, который вы пытаетесь использовать, и объясните, что именно он делает, чего вы не ожидали, или не делает того, что вы сделали.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.

Рейтинг:
34
Рейтинг:
2

BillWoodruff

Я собираюсь ответить на ваш вопрос очень "буквально", предполагая, что вы хотите запустить приложение WinForms со скрытой" первичной формой "и отображаемой Инициализированной формой, где пользователь вводит имя, а затем, когда пользователь закрывает инициализированную форму, вы хотите, чтобы ваша первичная форма (приложение) стала видимой и" захватила " информацию, введенную в инициализированную форму, чтобы вы могли использовать ее в своем приложении (первичная форма).

Итак, код InitialForm выглядит примерно так: предположим, что у вас есть текстовое поле и кнопка на нем, а также проводное событие нажатия кнопки:

public partial class InitialForm : Form
{
    public InitialForm() { InitializeComponent(); }

    // this 'exposes a string to the 'outside
    public string UserEnteredText { get; private set; }

    // see below for why you need to implement this
    //private void InitialForm_FormClosing(object sender, FormClosingEventArgs e)
    //{
        //UserEnteredText = textBox1.Text;
    //}

    private void button1_Click(object sender, EventArgs e)
    {
        UserEnteredText = textBox1.Text;

        Close();
    }
}
Итак, PrimaryForm (с которой вы начинаете свое приложение) содержит:
// this code would not work in the Form Load Event
private void PrimaryForm_Shown(object sender, EventArgs e)
{
    Visible = false;

    InitialForm iform = new InitialForm();

    iform.FormClosing += iform_FormClosing;

    iform.Show();
}

// this will contain the text the user entered on the InitialForm
private string UserEnteredText;

// note that this could be called by either the user pressing
// the Button on the InitialiForm, or by closing the InitialForm
// by clicking its 'CloseBox
private void iform_FormClosing(object sender, FormClosingEventArgs e)
{
    // note that we have to cast to 'InitialForm here
    // to access its public property
    UserEnteredText = (sender as InitialForm).UserEnteredText;
    
    // show the Primary Form
    Show();

    // for testing only
    MessageBox.Show("The user entered: " + UserEnteredText);
}
Но подождите: что произойдет, если у InitialForm был CloseBox, и пользователь закрыл его ? Свойство public string InitialForm никогда бы не поставили: таким образом, вам нужно добавить FormClosing EventHandler в InitialForm и "подключить его" (как показано в закомментированном коде выше для InitialForm):
private void InitialForm_FormClosing(object sender, FormClosingEventArgs e)
{
    UserEnteredText = textBox1.Text;
}
Рассмотрим преимущества и недостатки использования техники, показанной здесь:

1. Обратная сторона: InitialForm утилизируется: вы никогда не "сохраняли ссылку на него". вам не нужно было писать пользовательское событие в InitialForm и подписываться на него в первичной форме. Вам не нужно было (Хвала Господу) возиться с хитрым уведомлением об изменении свойств WinForm. Вам не нужно было делать ничего "модального"."

2. недостаток: вы не держите InitialForm рядом для возможного повторного использования: и это вполне вероятно (?). Написание пользовательского события в InitialForm, вызванного событием нажатия кнопки, на которое вы подписались в PrimaryForm, вполне может привести к "более чистому", более понятному и поддерживаемому коду.

Наконец: просто сделав InitialForm не имеющим CloseBox, вы можете устранить показанный здесь причудливый танец ручки в случае закрытия пользователем InitialForm таким образом, чтобы вы не могли "получить" информацию из его текстового поля.


Рейтинг:
17

Adarsh chauhan

Привет,

Попробовать это

private void btnShowForm_OnClick(...)
{
    if(/* perform credential test here */)
    {
        (new Form2()).Show(); // create and show the other form
        this.Hide(); // Hides this form
    }
    else
        MessageBox.Show("your Message!");
}


также посетите эти ссылки..

http://www.homeandlearn.co.uk/csharp/csharp_s13p1.html[^]


http://support.microsoft.com/kb/821773[^]


BillWoodruff

Это не сработает: ваше закрытие основной формы автоматически закроет вторую форму: если вы не изменили способ запуска вашего приложения WinForm. Кроме того, поскольку вторая форма создается в блоке "если", вы не сможете получить доступ к любой информации, введенной в нее за пределами этого блока.

Adarsh chauhan

вы правы. по ошибке я написал его как this. close() вместо this.Hide () ... теперь исправлено..
а насчет блока if, я написал это так, как будто хочу показать вторую форму, если значение textbox не пустое.. так что если блок может быть использован или не использоваться.. это зависит от необходимости.. :) любыми способами спасибо, что указали на это. close(); :)

Рейтинг:
0

Member 13395890

У меня была похожая задача: -
Основная форма для открытия и передачи значений (из текстового поля) в новую форму, которая может быть изменена, и передачи измененных данных обратно в исходную.
Этот набор решений, а также множество проб и ошибок помогли мне прийти к этому решению : -
Основная форма (form1) добавьте кнопку и текстовое поле.
Sub form (form2) добавьте кнопку и текстовое поле, затем в свойствах формы установите свойство "ControlBox" в значение " false"

Код для формы 1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TwoForms
{
    public partial class Form1 : Form
    {
        public static TextBox tb = new TextBox();
        Form2 secondForm = new Form2();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tb = textBox1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            secondForm.Show();
        }
    }

}


Код для формы 2: -
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TwoForms
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

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

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            Form1.tb.Text = textBox1.Text;
        }
    }
}


Graeme_Grant

Почему вы отвечаете на вопрос 4-летней давности? Как вы думаете, они все еще ждут вашего ответа? Пожалуйста, не надо. Есть много текущих вопросов, которые требуют помощи.

Member 13395890

В основном потому, что эта "нить" была почти в верхней части списка при поиске информации об использовании нескольких форм.
Это не сразу помогло, но дало мне подсказку, так что после долгих проб и ошибок я нашел путь вперед.
Поэтому в духе услужливости для будущих людей вроде меня решил опубликовать свои находки!