簡體   English   中英

從C#中的另一個隱藏表單控制表單

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

我正在一個正在向服務器發送登錄請求的客戶端上工作,如果被接受,則主窗口將被隱藏,用戶將以名為user_form的形式2開始工作...並且有3個按鈕可供用戶使用user_form(注銷-退出-隱藏)

我想從已經隱藏的主窗口中控制它們,

這是我正在使用的主要形式的代碼...但是它並沒有按照我想要的方式工作。

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;
}

有什么辦法嗎?

我通過添加一個新線程來運行.net套接字而不是主線程來修復它。

如果您只是想很好地控制從一種形式到另一種形式顯示的內容,也許這可以對您有所幫助...(您沒有提供相關代碼來舉例說明您的項目,所以我只制作了2種形式可以通過使用保存模型數據並由兩種形式共享的對象來彼此更改背景色,而不會彼此“過多了解”。

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:

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:

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");
        }
    }
}

編輯:如果要觸發表單上的其他操作,還可以在模型類上定義自己的事件並像PropertyChanged一樣觸發它們

占用事件的類應該簡單地注冊一個事件處理程序,就像Form2在此所做的那樣用於更新調用計數器


edit2:更改了示例代碼以顯示隱藏表單,並將代碼從button_click處理程序重定位為單獨的方法

如果我了解您要執行的操作,一種簡單的方法將是您擁有的控制表單具有公共功能,該功能在被調用時會影響該表單。 然后,您需要將這些表單的實例傳遞給可控制的表單(通常在構造函數中)。 然后,您可以從控制器表單中調用這些功能,從而影響受控表單。

范例:

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);
    }    
}

如果那能回答您的問題,我不知道,但是自從我偶然發現問題以來,這就是我解決問題的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM