Naweez
Naweez

Reputation: 313

open new winform

i have treeview which each node tag contain form name , when i click on node i open the form my code is as follows

  private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            NodeClick(Convert.ToString(e.Node.Tag));
        }

    public void NodeClick(string formName)
    {
       switch (formName)
        {

            case "frmPartMaster":
                frmPartMaster partMaster = null;
                if ((partMaster =   
                   (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster)))  
                        == null)
                {
                    partMaster = new frmPartMaster();
                    partMaster.Show(this);

                }
                else
                {
                    partMaster.Activate();
                    partMaster.WindowState = FormWindowState.Normal;
                    partMaster.BringToFront();
                }
                break;
        }
    }

this code is working fine but i have 1000's of form , for each for form i have to right case the code. is it possible if i passed the form it open it open like in single case?

Upvotes: 4

Views: 198

Answers (5)

Mihail Shishkov
Mihail Shishkov

Reputation: 15887

Why don't you just put a reference to a form in the Node's Tag and then use that directly

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            NodeClick(e.Node.Tag as Form);
        }

public void NodeClick(Form theForm)
{
   if(theForm == null) return;

   if(theForm.Visible == false)
   {
        theForm .Show(this);
   }

   theForm .Activate();
   theForm .WindowState = FormWindowState.Normal;
   theForm .BringToFront();
}

Upvotes: 2

Steve
Steve

Reputation: 216352

You could use this approach:

Define a Dictionary of strings and actions like this

Dictionary<string, Action> dic = new Dictionary<string,Action>();
dic.Add("frmPartMaster", OpenPartMaster);
.....

add the appropriate action

private void OpenPartMaster()
{
   frmPartMaster partMaster = null;
   if ((partMaster =   
               (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster)))  
                    == null)
   {
                partMaster = new frmPartMaster();
                partMaster.Show(this);

   }
   else
   {
                partMaster.Activate();
                partMaster.WindowState = FormWindowState.Normal;
                partMaster.BringToFront();
   }
}

and when you need to call that form instead of an infinite switch use

dic[formName].Invoke();

in this way you have a centralized point where you add the specific action to execute when a particular form is requested and you keep all the functionality already written.
Of course you need to refactor the switch cases in separate methods.

This approach is interesting if you have different actions (cases) for your form and not a always the same sequence of repeating code.

Upvotes: 0

Viacheslav Smityukh
Viacheslav Smityukh

Reputation: 5843

You can create instance of a form class by the call of Activator.CreateInstance

public void OpenOrActivateForm(string formType)
{
  var formType = Type.GetType(formType);
  var form = Globale.IsFormAlreadyOpen(formType);

  if(form == null)
  {
    form = Activator.CreateInstance(formType);
    from.Show(this);
  }
  else
  {
    form.Activate();
    form.WindowState = FormWindowState.Normal;
    form.BringToFront();
  }
}

Upvotes: 2

Rumit Parakhiya
Rumit Parakhiya

Reputation: 2714

Instead of using switch case for every form, you can use Activator.CreateInstance method.

Refer this MSDN Article.

You can store Fully Qualified Name in the tag and use it to instantiate appropriate form.

Upvotes: 0

Angelom
Angelom

Reputation: 2531

You should be able to add the form to the node, the node should have a field, tag i think it is that is of type object. Add your form there then extract it from the tag. That way you will not have to use a case statement but 1 single statement that works for all forms.

Upvotes: 0

Related Questions