C# 如何更改另一种形式的标签文本

标签 c# forms text

所以我有两种形式。

表单 1 是我的主表单,表单 2 是我在文本框中输入文本以显示在表单 1 上的标签上的地方。此外,用于“确认”并实际更改标签输入文本的按钮也在表单上2 需要保持这种状态。

由于某种原因,这不起作用。

Form 2有一个文本框和一个按钮,当我按下按钮时,它会更改指定字符串的字符串值。
该字符串链接到表单 1 上的标签。该字符串正在更改,因此这不是问题。我通过添加一个按钮来确认这一点,该按钮会弹出一个显示新字符串值的消息框。

在寻找答案时我发现这一定是某种令人耳目一新的问题,我尝试了很多方法但没有成功。只有那些将我的按钮放在表单 1 而不是 2 上的人才有效。

我已经连续 3 个小时在谷歌上搜索如何解决这个问题,但要么这些方法不起作用,要么它们将我的按钮从表单 2 更改为我的主表单(表单 1)。

请别说我懒,我真的找不到有效的方法!

编辑:

代码

GameScreen.cs

namespace _2pGame
{   
    public partial class GameScreen : Form
    {     
        public  GameScreen()
        {
            InitializeComponent();

            P1NameLabel.Text = gm.P1Name;
            P1ClassLabel.Text = gm.P1Class;
            P2NameLabel.Text = gm.P2Name;
            P2ClassLabel.Text = gm.P2Class;                
        }       

        private void PlayerInfoButton_Click(object sender, EventArgs e)
        {
            PlayerInfo playerinfoload = new PlayerInfo();
            playerinfoload.Show();
        }
   }    

}

玩家信息.cs

namespace _2pGame 
{       
    public partial class PlayerInfo : Form 
    { 
        public PlayerInfo() 
        {
            InitializeComponent();        
        }

        public void ConfirmPlayerInfo_Click(object sender, EventArgs e)
        {
            gm.P1Class = P1ClassChoice.Text;
            gm.P1Name = P1TextBox.Text;
            gm.P2Class = P2ClassChoice.Text;
            gm.P2Name = P2TextBox.Text;                     
        }   
    }
}

引用.cs

namespace _2pGame
{    
    public partial class gm
    {        
        public static string 
        P1Class,
        P2Class,
        P1Name,
        P2Name;        
    }
}

最佳答案

解决这种众所周知的情况的方法是通过代表......

在您的 PlayerInfo 表单中声明

public partial class PlayerInfo : Form 
{ 
    // define the delegate type (a parameterless method that returns nothing)
    public delegate void OnConfirmPlayer();

    // declare a public variable of that delegate type
    public OnConfirmPlayer PlayerConfirmed;

    .....

    public void ConfirmPlayerInfo_Click(object sender, EventArgs e)
    {
        gm.P1Class = P1ClassChoice.Text;
        gm.P1Name = P1TextBox.Text;
        gm.P2Class = P2ClassChoice.Text;
        gm.P2Name = P2TextBox.Text;

        // Check is someone is interested to be informed of this change
        // If someone assign a value to the public delegate variable then
        // you have to call that method to let the subscriber know 
        if (PlayerConfirmed != null) 
            PlayerConfirmed();
    }
}

然后在 GameScreen 表单中,在显示 PlayerInfo 表单之前,将公共(public) PlayerInfo.PlayerConfirmed 设置为 GameScreen 表单类中的方法

private void PlayerInfoButton_Click(object sender, EventArgs e)
{
    PlayerInfo playerinfoload = new PlayerInfo();

    // Subscribe to the notification from PlayerInfo instance
    playerinfoload.PlayerConfirmed += PlayerHasBeenConfirmed;

    playerinfoload.Show();
}

// Method that receives the notification from PlayerInfo 
private void PlayerHasBeenConfirmed()
{
     P1NameLabel.Text = gm.P1Name;
     P1ClassLabel.Text = gm.P1Class;
     P2NameLabel.Text = gm.P2Name;
     P2ClassLabel.Text = gm.P2Class; 
}

这种方法的优点是可以避免 GameScreen 和 PlayerInfo 之间的耦合。无需知道 PlayerInfo 内是否存在 GameScreen 表单及其属性名称。您只需发布一个委托(delegate),订阅者可以注册该委托(delegate)以获取更改通知,并让订阅者执行自己的代码。

关于C# 如何更改另一种形式的标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179647/

相关文章:

c# - 将自定义日期转换为mysql日期时间

c# - ElapsedTime 性能计数器的适当初始值是多少?

c# - Gridview 固定标题

Android:有没有办法用 DateUtils 显示 "min"而不是 "minute"

text - 批量查找并替换Sublime Text 2

c# - 在 DataGridView 中将 IsNewRow 状态更改为 false 或模拟单元格上的击键

HTML 和 CSS,水平对齐 2 个按钮而不丢失表单操作

php - Symfony2 - 自定义 FormType 类

php - 如何将<select>中的时间输入mysql并让它输出am/pm?

python - python读取特殊格式的文本文件