Как вызвать функции одного и того же объекта из разных форм? - PullRequest
1 голос
/ 20 октября 2010

Я использую winform с c #.

У меня есть formA и formB.formB - это небольшое окно, в котором есть текстовое поле и кнопка для сохранения всего, что написано в текстовом поле.

Так что я в formB вызываю функцию сохранения из класса, который был определен в formA.Как бы я это сделал?

Спасибо,

J

Ответы [ 8 ]

1 голос
/ 20 октября 2010

Форма A

Если этот объект находится в Форма A примерно так:

// In Form A
MyThing thing = new MyThing();

, тогда создайте публичное свойство в своей форме для доступа к нему из любого другого меставот так:

 // still in Form A

public void InvokeSave() {
    myThing.Save();
}

Форма B

Внутри Форма B Вы можете вызывать метод формы A следующим образом:

// Inside Form B

void myButton_Click(..) {
    formAReference.InvokeSave();
}

Вам нужно будет где-то хранить ссылку на исходную форму - это то, что я назвал formAReference


Существуют различные способы передачи объектов и выполнения вызовов между winforms.Например, просто Google " передача объектов между winforms " и выберите ситуацию, которая кажется подходящей для вашего приложения.Помните, что winform - это объект .NET, поэтому те же понятия, которые применяются к передаче данных и сообщений между чистыми объектами .NET, также применимы к winforms.

Учебное пособие / Пример в проекте кода

Сводка

Вы успешно получили доступ к своему объекту, скомпонованному в форму A, с помощью открытого метода в форме A изнутри формы B. Вы можете получить доступ к этому методу.откуда угодно.

0 голосов
/ 20 октября 2010

Привет, Джон ........ Самый простой способ это ниже

string returnValue = Application.OpenForms["OpenFormName"].Controls["ControlName"].Text 
0 голосов
/ 20 октября 2010

Хей Джон ..., Если я вас правильно понял ... тогда почему бы просто не создать новый экземпляр этого класса (определенный в formA) внутри вашего formB, а затем вызвать метод save ..?

Я правильно вас понял?

0 голосов
/ 20 октября 2010

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

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

Пример:

class SaveDataEventArgs : EventArgs
{
    public readonly string Data;
    public SaveDataEventArgs( string data )
    {
        Data = data;
    }
}

class ChildForm
{
    public event EventHandler<SaveDataEventArgs> SaveData

    void button_Click( ... )
    {
        OnSaveData( new SaveDataEventArgs( textbox1.Text );
    }

    protected virtual void OnSaveData( SaveDataEventArgs e )
    {
        EventHandler<SaveDataEventArgs> del = SaveData;
        if( del != null )
        {
            SaveData( this, e );
        }
    }
}

class Form1 : Form
{
    void ShowChildForm( )
    {
        using( ChildForm frm = new ChildForm() )
        {
            frm.SaveData += frm_SaveData;
            frm.ShowDialog();
        }
    }

    void frm_SaveData( object sender, SaveDataEventArgs e )
    {
        label1 = e.Data;  // data from the child form, do what you need to do with it
    }
}
0 голосов
/ 20 октября 2010

UPDATE: Вы можете попробовать следующий код. Код для формы А: (напишите этот код в любом методе FormA, например, любую кнопку в FormA, вы можете написать его в событии нажатия этой кнопки)

            StringBuilder bankName = new StringBuilder();
            FormB objFormBsaveBank = new FormB(bankName);
            objFormBsaveBank.ShowDialog();

           // Text in textbox of the FormB can be access from here and can be stored in any variable
           string bankname = bankName.ToString();

Код для формы B:

public class FormB : Form
   {

    StringBuilder bankName;

    // Constructore for FormB
    public FormB(StringBuilder bankName)
    {
        InitializeComponent();
        this.bankName = bankName;
    }

    // click event for button which is on the FormB
    private void button1_Click(object sender, EventArgs e)
    {
        // name of textbox which is on FormB is "BankNameTextBox"
        this.bankName.Append(BankNameTextBox.Text);           
        this.Close();
    }
}
0 голосов
/ 20 октября 2010

почему бы не использовать статические поля?Это простой способ передать сообщение.Когда вы нажимаете кнопку «Сохранить», она сохраняет ее в статическом классе, а после этого вы читаете ее из формы B

.
0 голосов
/ 20 октября 2010

создать объект для класса formA.Если объявленный метод не является приватным, вы можете получить доступ к нему.

0 голосов
/ 20 октября 2010

Отправить ссылку на класс, содержащий функцию, для formb. что-то вроде новой FormB (ReferenceClass Reference)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...