【问题标题】:Transmitting events from a Winform to another in C#在 C# 中将事件从 Winform 传输到另一个
【发布时间】:2015-01-20 23:41:36
【问题描述】:

如何在一个表单中单击按钮(生成颜色)并在另一个表单中更改 RichTextBox 中的文本颜色?提前致谢。 (新手试图理解 C#) 一些代码:

1.WinForm

 public delegate void ColorWindowEvent(Object sender, SecondrWindowEventArgs e);

    public partial class ColorWindow : Form
    {
        public event ColorWindowEvent myEventHandler;

        public ColorWindow ()
        {
            InitializeComponent();
        }

        public void MyEvent(Object sender, ColorWindowEventArgs e)
        {
            string s = "";
            myEventHandler(this, new SecondWindowEventArgs(s)); 
        }

        private void btnRed_Click(object sender, EventArgs e)
        {
            Color c = Color.Red;
            string s = c.ToString();
            this.Close();
        }

        private void btnBlue_Click(object sender, EventArgs e)
        {
            Color c = Color.Blue;
            string str = c.ToString();
            this.Close();

        }

        private void btnGreen_Click(object sender, EventArgs e)
        {
            Color c = Color.Green;
            string s = c.ToString();
            this.Close();
        }
    }
    public class SecondWindowEventArgs : EventArgs
    {
        private string s;
        public SecondWindowEventArgs(string _s)
        {
            s = _s;

        }
        #region
        public string S
        {
            get;
            set;
        }
        #endregion
    }

2.WinForm

public delegate void SecondWindowEvent(Object sender, FirstWindowEventArgs e);

public partial class SecondWindow : Form
{
    public event SecondWindowEvent myEventHandler;
    private string s;

    public SecondWindow(String _s)
    {
        s = _s;
        InitializeComponent();
    }

    public void MyEvent(Object sender, FirstWindowEventArgs e)
    {
        string str = rtf2.Text;
        if (str != null)
        {
            myEventHandler(this, new FirstWindowEventArgs(str));
        }
    }
    private void btnQuit_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void rtf2_TextChanged(object sender, EventArgs e)
    {
        if (myEventHandler != null)
        {
         myEventHandler(this, new FirstWindowEventArgs(rtf2.Text.Substring(rtf2.Text.Length - 1)));
         rtf2.ForeColor = Color.FromName(e.ToString());

        }
    }

    private void btnClearText_Click(object sender, EventArgs e)
    {
        rtf2.Text = " ";
    }

    private void rtf2_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Escape)
        {
            FargeVindu fargeVindu = new FargeVindu();
            fargeVindu.minEventHandler += new FargeVinduEvent(fargeVindu_minEventHandler);
            fargeVindu.Show();
        }
        else if (e.KeyData == Keys.Delete)
        {

        }

    }
    protected void ColorWindow_myEventHandler(object sender, SecondWindowEventArgs e)
    {
        rtf2.ForeColor = Color.FromName(s);
    }

    Random random = new Random();
    private void SecondWindow_Load(object sender, EventArgs e)
    {
        lblText.ForeColor = Color.FromArgb(random.Next(255),
    random.Next(255), random.Next(255));
    }
    public Color getColor
    {
        get;
        set;
    }

}

3.WinForm

 public partial class FirstWindow : Form
    {
        public FirstWindow()
        {
            InitializeComponent();
        }

        private void btnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnClick_Click(object sender, EventArgs e)
        {
            string str = " ";
            SecondWindow secondWindow = new SecondWindow (str);

            secondWindow.myEventHandler += new SecondWindowEvent(secondWindow_myEventHandler);
            secondWindow.Show();
        }

        protected void secondWindow_myEventHandler(object sender, FirstWindowEventArgs e)
        {
            rtf1.AppendText(String.Format(e.Tekst));
        }

        public void btnClearText_Click(object sender, EventArgs e)
        {
            rtf1.Text = " ";
        }
    }

来自 cmets 的澄清

我希望表单在单击按钮后关闭时更改颜色。这是我尝试过的:

private void btnRed_Click(object sender, EventArgs e) 
{
    Color c = Color.Red; 
    string s = c.ToString(); 
    this.Close(); 
} 

【问题讨论】:

  • 您是要保持两个表单都打开还是单击按钮后表单更改颜色关闭
  • 表单更改颜色在单击按钮后关闭。这就是我尝试过的: private void btnRed_Click(object sender, EventArgs e) {Color c = Color.Red;字符串 s = c.ToString(); this.Close(); }
  • 能否请您发布一些代码。这将有助于我们了解您是如何打开表单的,以便更好地回答您。
  • 代码已发布。
  • FirstWindowEventArgsColorWindowEventArgs 的声明在哪里

标签: c# winforms events event-handling


【解决方案1】:

要回答您的问题,请在您的颜色表单上创建一个由您的按钮设置的属性,然后您可以在表单从您的ShowDialog 语句返回时关闭它后读取它。

Form1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        if(frm2.ShowDialog() == DialogResult.OK)
        {
           //this.BackColor=frm2.getColor;  helps if I read the question more closely
           richTextBox1.SelectionColor = frm2.getColor;
        }
    }
}

Form2

public partial class Form2 : Form
{
    public Color getColor { get; set; }
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        getColor = Color.Red;
        DialogResult = DialogResult.OK;
    }
}

在使用了您发布的代码并添加了一些缺少的处理程序后,您的颜色文本看起来采用了Color [Red] 的格式@ ColorFromName 不知道如何解析它,因此您需要获取实际的使用String.Split 类似这样的颜色名称。

protected void ColorWindow_myEventHandler(object sender, SecondWindowEventArgs e)
{
    rtf2.ForeColor = Color.FromName(e.S.Split(new string[]{"[","]"},StringSplitOptions.None)[1]);
}

我还注意到,每次文本更改时,您都在设置 rtf2.ForeColor,我将其删除,现在可以更改 RichText 框的前景色。如果您只是传递实际的颜色对象而不是将其更改为字符串并返回,恕我直言,我会更容易/更干净。

这是修改后的 TextChanged 方法,注意注释掉的 rtf2.ForeColor 语句它不属于那里。

private void rtf2_TextChanged(object sender, EventArgs e)
{
    if (myEventHandler != null)
    {
     myEventHandler(this, new FirstWindowEventArgs(rtf2.Text.Substring(rtf2.Text.Length -1)));
    // rtf2.ForeColor = Color.FromName(e.ToString());

    }
}

【讨论】:

  • 我试过你的答案,但它不起作用。当我单击另一个表单中的按钮(触发颜色事件)时,我想更改表单中 RichTextBox 中文本的颜色。我发布了整个代码。感谢您的回答。
  • 如何将 Color 作为 Color 对象传递?
  • 抱歉,它对我不起作用。我使用了您的方法 ColorWindow_myEventHandler ,但仍然无法更改 RTB 中的文本颜色。您发布说您添加了一些缺少的处理程序,您能解释/发布这些吗?
  • 您的示例无法编译,因为您缺少我要求作为对您问题的评论的事件处理程序,因此我不得不即兴发挥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多