How to call mainform method in another form in usercontrol c #

I work with windowsFrom in C #. I am trying to call the mainfrom method in one of the user controls. I have a mainfrom like this

namespace Project
{
  public partial class MainForm : Form
   {
    public MainForm()
    {
        InitializeComponent();
    } 

    public void TempCommand()
      {
       StartTemp();
      }
   }
 }

I have a button in a user control. When I click this button, another form will open. I have code similar to this in a user control.

   private TempCalib _tempCalib = new TempCalib();

   private void calibBtn_Click(object sender, EventArgs e)
    {
        _tempCalib.Show();
    }

it will open another and I have one button from this. I need to call the mainfrom method when I click the OK button on this.

namespace Project
{
public partial class TempCalib : Form
{

    public TempCalib()
    {
        InitializeComponent();
    }

    private void OkButton_Click(object sender, EventArgs e)
    {
       // I need to call the mainfrom "TempCommand" method here.
        this.Hide();
    }


   }
 }

Can anyone help me how to do this.

Thanks.

0
source share
5 answers

Quick response

Just add a link to the main form in your sub form:

public partial class TempCalib : Form
{
    private  MainForm _main

    public TempCalib(MainForm main) : this()
    {
        _main = main;
    }

    /// Other stuffs
}

:

private TempCalib _tempCalib;
private void calibBtn_Click(object sender, EventArgs e)
{
     if (_tempCalib == null)
         _tempCalib = new TempCalib(this);

     _tempCalib.Show();
}

calibBtn_Click MainForm ( UserControl), _tempCalib :

_tempCalib = new TempCalib((MainWindow)FindForm());

:

private void OkButton_Click(object sender, EventArgs e)
{
    _main.TempCommand();  
    this.Hide();
}

: , MainForm ( , ), TempCalib UserControl, Form ( , UserControl ).

. , Form - , Form. ?

1. DECOUPLE CONTROLS. , , , TempCalib MainForm :

public partial class TempCalib : Form
{
    public event EventHandler SomethingMustBeDone;

    private void OkButton_Click(object sender, EventArgs e)
    {
        OnSomethingMustBeDone(EventArgs.Empty); / TO DO
       this.Hide();
    }
}

MainForm:

private TempCalib _tempCalib;
private void calibBtn_Click(object sender, EventArgs e)
{
     if (_tempCalib == null)
     {
         _tempCalib = new TempCalib();
         _tempCalib.SomethingMustBeDone += _tempCalib_SomethingMustBeDone;

         // In _tempCalib_SomethingMustBeDone you'll invoke proper member
         // and possibly hide _tempCalib (remove it from OkButton_Click)
     }

     _tempCalib.Show();
}

2. DECOUPLE LOGIC FROM CONTROLS. , ( , , ). ( TempCalib , ). (, ) , . ( ), TempCalib ( ) MainForm :

public partial class MainForm : Form
{
    public event EventHandler Calibrate;

    protected virtual void OnCalibrate(EventArgs e)
    {
        // TODO
    }
}

:

public class MyTaskController
{
    private MainForm _main;
    private TempCalib _tempCalib;

    public void Start()
    {
        _main = new MainForm();
        _main.Calibrate += OnCalibrationRequested;
        _main.Show(); // Or whatever else
    }

    private void OnCalibrationRequested(object sender, EventArgs e)
    {
        if (_tempCalib == null)
        {
            _tempCalib = new TempCalib();
            _tempCalib.SomethingMustBeDone += OnSomethingMustBeDone();
        }

        _tempCalib.Show();
    }

    private OnSomethingMustBeDone(object sender, EventArgs e)
    {
        // Perform the task here then hide calibration window
        _tempCalib.Hide();
    }    
}

, , ( , ) . , , ( ). , () ( , WinForms WPF, ). , ... : , , , , .

3. DECOUPLE LOGIC . ( ). (MainForm TempCalib). , (, ), , . :

public interface IUiWindow
{
    void Show();
    void Hide();
}

public interface IMainWindow : IUiWindow
{
    event EventHandler Calibrate;
}

public interface ICalibrationWindow : IUiWindow
{
    event EventHandler SomethingMustBeDone;
}
+3

usercontrol . .

0

, UserControl. , . UserControl , , UserControl.

, TempCalib:

public delegate void OkClickedHandler(object sender, EventArgs e);
public event OkClickedHandler OkClicked;

private void OkButton_Click(object sender, EventArgs e)
{
    // Make sure someone is listening to event
    if (OkClicked == null) return;

    OkClicked(sender, e);

    this.Hide();       
}

:

private void Mainform_Load(object sender, EventArgs e)
{
    _tempCalib.OkClicked += CalibOkClicked;
}

private void CalibOkClicked(Object sender, EventArgs e)
{
    StartTemp();
}
0

1:

    UserControl1 myusercontrol = new UserControl1();

    public void TabClose(Object sender,EventArgs e)
    {
        int i = 0;
        i = tabControl1.SelectedIndex;
        tabControl1.TabPages.RemoveAt(i);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        myusercontrol.Dock = DockStyle.Fill;
        TabPage myTabPage = new TabPage();
        myTabPage.Text = "Student";
        myTabPage.Controls.Add(myusercontrol);
        tabControl1.TabPages.Add(myTabPage);
        myusercontrol.OkClick += TabClose;

    }

UserControl1:

     public delegate void OkClickedHandler(Object sender, EventArgs e);

public partial class UserControl1 : UserControl
{

    public event OkClickedHandler OkClick;
    public UserControl1()
    {
        InitializeComponent();

    }


    private void button3_Click(object sender, EventArgs e)
    {
        if (OkClick == null) return;
        OkClick(sender, e);

    }
}
0

:

:

MainForm form = this.TopLevelControl as MainForm;
form.TempCommand();
-1

All Articles