简体   繁体   English

从C#中的另一个隐藏表单控制表单

[英]Control a Form from another Hidden Form in C#

I am working on a client that is sending a request to the server to login and if it's accepted the main window shall be hidden and user will start work on the form 2 named user_form ... and there are 3 buttons available for the users on the user_form ( logout - exit - hide ) 我正在一个正在向服务器发送登录请求的客户端上工作,如果被接受,则主窗口将被隐藏,用户将以名为user_form的形式2开始工作...并且有3个按钮可供用户使用user_form(注销-退出-隐藏)

I want control them all from the main window which is already hidden ,,, 我想从已经隐藏的主窗口中控制它们,

Here is the code I am working with in main form ... but it's not working as I want. 这是我正在使用的主要形式的代码...但是它并没有按照我想要的方式工作。

switch (client.LoginInfo.Limited)
{
    case true:
        this.Hide();
        User_Form LF = new User_Form(client);
        LF.AdminControlIsVisible = false;
        DialogResult dr = LF.ShowDialog(this);
        if (dr == System.Windows.Forms.DialogResult.Cancel)
        {
            //logout
        }
        else if (dr == System.Windows.Forms.DialogResult.OK)
        {
            if (client != null)
            {
                //hide
            }
            else
            {
                UpdateSystemMessage("No response from the server !!");
            }
            return;
        }
        break;
    case false:
        User_Form LF = new User_Form(client);
        LF.AdminControlIsVisible = false;
        DialogResult dr = LF.ShowDialog(this);
        this.Visible = false;
        if (dr == System.Windows.Forms.DialogResult.Cancel)
        {
            //logout
        }
        else if (dr == System.Windows.Forms.DialogResult.OK)
        {
            if (client != null)
            {
                //hide
            }
            else
            {
                UpdateSystemMessage("No response from the server !!");
            }
            return;
        }
        break;
}

Any solution ? 有什么办法吗?

我通过添加一个新线程来运行.net套接字而不是主线程来修复它。

if you just want to nicely control things that are shown on one form, from another form, maybe this can help you ... (you did not provide the relevant code to give an example using your project, so i just made 2 forms that can change each others background color, without "knowing" each other too much, by using an object that holds the model data and is shared by both forms...) 如果您只是想很好地控制从一种形式到另一种形式显示的内容,也许这可以对您有所帮助...(您没有提供相关代码来举例说明您的项目,所以我只制作了2种形式可以通过使用保存模型数据并由两种形式共享的对象来彼此更改背景色,而不会彼此“过多了解”。

Form1.cs: Form1.cs中:

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        MyModelClass model = new MyModelClass();
        public Form1()
        {
            InitializeComponent();
            model.AnotherColor = model.AColor = System.Drawing.Color.FromKnownColor(KnownColor.Control);
            bindingSource1.DataSource = model;
            this.DataBindings.Add("BackColor", bindingSource1, "AColor");
            this.DataBindings.Add("Visible", bindingSource1, "ABool");
            new Form2(model).Show();
        }

        private BindingSource bindingSource1;
        private Button button1;
        private Button button2;
        private Button button3;
        private Button button4;
        private Button button5;

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.button3 = new System.Windows.Forms.Button();
            this.button4 = new System.Windows.Forms.Button();
            this.button5 = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(12, 12);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(127, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "Form2 -> green";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(12, 41);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(127, 23);
            this.button2.TabIndex = 1;
            this.button2.Text = "Form2 -> red";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // button3
            // 
            this.button3.Location = new System.Drawing.Point(12, 70);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(127, 23);
            this.button3.TabIndex = 2;
            this.button3.Text = "Form2 -> Visible";
            this.button3.UseVisualStyleBackColor = true;
            this.button3.Click += new System.EventHandler(this.button3_Click);
            // 
            // button4
            // 
            this.button4.Location = new System.Drawing.Point(12, 99);
            this.button4.Name = "button4";
            this.button4.Size = new System.Drawing.Size(127, 23);
            this.button4.TabIndex = 3;
            this.button4.Text = "Form2 -> Invisible";
            this.button4.UseVisualStyleBackColor = true;
            this.button4.Click += new System.EventHandler(this.button4_Click);
            // 
            // button5
            // 
            this.button5.Location = new System.Drawing.Point(46, 159);
            this.button5.Name = "button5";
            this.button5.Size = new System.Drawing.Size(106, 42);
            this.button5.TabIndex = 4;
            this.button5.Text = "some important form1 button";
            this.button5.UseVisualStyleBackColor = true;
            this.button5.Click += new System.EventHandler(this.button5_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.button5);
            this.Controls.Add(this.button4);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            model.AnotherColor = Color.Green;
            model.doSomething();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            model.AnotherColor = Color.Red;
            model.doSomething();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            model.AnotherBool = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            model.AnotherBool = false;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            model.someImportantMethod();
        }
    }
}

Form2.cs: Form2.cs:

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

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        MyModelClass model;
        private Button button4;
        private Button button3;
        private Button button5;
        int callCounter = 0;
        public Form2(MyModelClass model)
        {
            InitializeComponent();
            this.model = model;
            bindingSource1.DataSource = model;
            DataBindings.Add("BackColor", bindingSource1, "AnotherColor");
            this.DataBindings.Add("Visible", bindingSource1, "AnotherBool");

            model.PropertyChanged += new PropertyChangedEventHandler(model_PropertyChanged);
        }

        void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            label1.Text = String.Format("PropertyChanged was called {0} times.", ++callCounter);
        }

        private BindingSource bindingSource1;
        private Button button2;
        private Button button1;
        private Label label1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
            this.button2 = new System.Windows.Forms.Button();
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.button4 = new System.Windows.Forms.Button();
            this.button3 = new System.Windows.Forms.Button();
            this.button5 = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
            this.SuspendLayout();
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(18, 41);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(127, 23);
            this.button2.TabIndex = 3;
            this.button2.Text = "Form1 -> red";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(18, 12);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(127, 23);
            this.button1.TabIndex = 2;
            this.button1.Text = "Form1 -> green";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(15, 231);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(181, 13);
            this.label1.TabIndex = 4;
            this.label1.Text = "PropertyChanged was called 0 times.";
            // 
            // button4
            // 
            this.button4.Location = new System.Drawing.Point(18, 99);
            this.button4.Name = "button4";
            this.button4.Size = new System.Drawing.Size(127, 23);
            this.button4.TabIndex = 6;
            this.button4.Text = "Form1 -> Invisible";
            this.button4.UseVisualStyleBackColor = true;
            this.button4.Click += new System.EventHandler(this.button4_Click);
            // 
            // button3
            // 
            this.button3.Location = new System.Drawing.Point(18, 70);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(127, 23);
            this.button3.TabIndex = 5;
            this.button3.Text = "Form1 -> Visible";
            this.button3.UseVisualStyleBackColor = true;
            this.button3.Click += new System.EventHandler(this.button3_Click);
            // 
            // button5
            // 
            this.button5.Location = new System.Drawing.Point(154, 164);
            this.button5.Name = "button5";
            this.button5.Size = new System.Drawing.Size(94, 40);
            this.button5.TabIndex = 7;
            this.button5.Text = "some less important button";
            this.button5.UseVisualStyleBackColor = true;
            this.button5.Click += new System.EventHandler(this.button5_Click);
            // 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.button5);
            this.Controls.Add(this.button4);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Name = "Form2";
            this.Text = "Form2";
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            model.AColor = Color.Green;
            model.doSomething();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            model.AColor = Color.Red;
            model.doSomething();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            model.ABool = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            model.ABool = false;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            MessageBox.Show("some less important button was clicked ... \nnow calling the same method that's called from form1's important button");
            model.someImportantMethod();
        }
    }
}

MyModelClass.cs: MyModelClass.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public class MyModelClass : System.ComponentModel.INotifyPropertyChanged
    {
        private System.Drawing.Color _aColor;

        public System.Drawing.Color AColor
        {
            get { return _aColor; }
            set { 
                _aColor = value;
                fireChanged("AColor");
            }
        }

        private System.Drawing.Color _anotherColor;

        public System.Drawing.Color AnotherColor
        {
            get { return _anotherColor; }
            set { 
                _anotherColor = value;
                fireChanged("AnotherColor");
            }
        }

        private bool _aBool = true;

        public bool ABool
        {
            get { return _aBool; }
            set
            {
                _aBool = value;
                fireChanged("ABool");
            }
        }

        private bool _anotherBool = true;

        public bool AnotherBool
        {
            get { return _anotherBool; }
            set
            {
                _anotherBool = value;
                fireChanged("AnotherBool");
            }
        }


        public void doSomething() 
        {
            //some function here
            System.Windows.Forms.MessageBox.Show("doSomething() was called"); 
        }

        private void fireChanged(string name)
        {
            var evth = PropertyChanged;
            if (evth != null)
                evth(this, new System.ComponentModel.PropertyChangedEventArgs(name));
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        internal void someImportantMethod()
        {
            System.Windows.Forms.MessageBox.Show("some important mehod, that is usually called from a button in from1");
        }
    }
}

edit: if you want to trigger other actions on a form, you can also define your own events on the model class and fire them just like PropertyChanged 编辑:如果要触发表单上的其他操作,还可以在模型类上定义自己的事件并像PropertyChanged一样触发它们

the class that consumes your event should simply register an event handler, like Form2 here does for updating the call counter 占用事件的类应该简单地注册一个事件处理程序,就像Form2在此所做的那样用于更新调用计数器


edit2: changed example code to show hiding forms and relocating code from button_click handler to seperate method edit2:更改了示例代码以显示隐藏表单,并将代码从button_click处理程序重定位为单独的方法

If i understand what you are trying to do, one simple way would be that the forms you wnat controlled have public fonction that when called influence the form. 如果我了解您要执行的操作,一种简单的方法将是您拥有的控制表单具有公共功能,该功能在被调用时会影响该表单。 You would then need to pass the instance of those forms to the form that controlls (usually in the constructor). 然后,您需要将这些表单的实例传递给可控制的表单(通常在构造函数中)。 You could then call those fonctions from the controller form and therefore affect the controlled forms. 然后,您可以从控制器表单中调用这些功能,从而影响受控表单。

Example : 范例:

public class ControlledForm : Form 
{
    //...        

    //This founction will affect the form
    public void DoSomething(int Params)
    {
    //Affect Form
    }

    private void SomethingEventHandler() //function that calls the new form and hides this one
    {
        //Give the construction this (the instance of the form) in parameter
        ControllerForm newControllerForm = new ControllerForm(this);
        newControllerForm.Show();
        this.Hide();
    }
}

public class ControllerForm : Form
{
    //Constructor that receives the instance of the controlled form in parameter
    public ControllerForm(ControlledForm CF)
    {
        _ControlledForm = CF;
        InitializeComponents();
    }

    private ControlledForm _ControlledForm;

    private void SomethingElseEventHandler() //Function that modifies the controlled form
    {
        //This will effectively affect the form
        _ControlledForm.DoSomething(12);
    }    
}

I don't if that's answers your question, but that's how I tackled the problem since I stumbled upon it. 如果那能回答您的问题,我不知道,但是自从我偶然发现问题以来,这就是我解决问题的方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM