将多个userControl中的数据传递到表单

时间:2017-11-24 22:59:43

标签: c# winforms user-controls

我需要制作一个带名字的记分牌。

在第一张表格中,您可以通过用户控件添加玩家。

Button1_click将UserControl1添加到面板中。 UserControl1只有一个文本框,标签和一个按钮,当插入文本并按下按钮(在UserControl1内)时,文本被传输到标签中,按钮和文本框被丢弃。

现在,当用户完成添加足够的玩家后,他按下第二个按钮,这将打开第二个表单,一个面板。

现在这个面板需要第二个userControl,因为只有一个标签。 (这必须是userControl,因为以后我会添加分数) 所以现在,程序必须读取,用户在Form1中添加的所有名称都将它们添加到userControl2标签中,并将该userControl添加到Form2的面板中

我希望这是有道理的。

这是我到目前为止所做的:

Form1代码

public List<PlayerAdder> PlayerList { get; set; } = new List<PlayerAdder>();

    private void B_AddPlayer_Click(object sender, EventArgs e)
    {
        count++;
        PlayerAdder PA = new PlayerAdder();
        PlayerList.Add(PA);           
        for (int J = 0; J < count; J++)
        {
            GBX_Title.Text = "Mängijate Arv: " + count;
            flowLayoutPanel1.Controls.Add(PA);
        }      
    }

正如你所看到的,我已经制作了一个列表,它应该存储名称。

我还有一个包含以下内容的CodeFile:

 public class MyData
{
    public List<Players> Players { get; set; }
}
public class Players
{
    public string PlayerName { get; set; }
}

应该将名称发送到列表的第一个UserControl:

    public string PlayerName
    {
        get { return NameInput.Text; }
        set { NameInput.Text = value; }
    }

Form2将拥有此代码:

 private void PlayerNames() 
    {
        for (int i = 0; i < gameInfo.Players.Count; i++)
        {
            ScoreboardMenuControl SMC = new ScoreboardMenuControl();
            flowlayoutpanel.Controls.Add(SMC);
        }
    }

和最后一个ScoreboardMenuControl我还没有想出任何东西.. 这很难消化,但希望你理解。 这是我想要做的视觉

From1 - &gt; UserControl1 - &gt;数据

Form1 - &gt; Form2 - &gt;面板 - &gt; UserControl2 - &gt;数据

1 个答案:

答案 0 :(得分:1)

因此,您应该将您的数据从Form1.UserControl1传递给Form2.UserControl2。我建议你通过Form2构造函数这样做:

public Form2(MyData data)
{
    this.InitializeComponent();
    this.userControl2.Data = data;
}

然后在Form1中你可以这样做:

var form2 = new Form2(this.userControl11.Data);

然而,这将使Form2紧密耦合到Form1。为避免这种情况,您可以通过这样的接口传递数据。首先,像这样创建IMyData接口:

public interface IMyData
{
    List<Player> Players { get; set; }
}

然后你的MyData类应该实现这个接口。然后在Form2构造函数中等待IMyData接口,而不是像这样的具体实现:

public Form2(IMyData data)
{
    this.InitializeComponent();
    this.userControl2.Data = data;
}

这将在以后测试您的项目以模拟MyData时帮助您。