将数据从多个用户控件传递到表单
Passing data from multiple userControls to a form
我需要制作一个带有名字的记分牌。
在第一个表单中,您通过用户控件添加玩家。
Button1_click 将 UserControl1 添加到面板中。
UserControl1 只有一个文本框、标签和一个按钮,当插入文本并按下按钮(在 UserControl1 内)时,文本将转移到标签中,并处理按钮和文本框。
现在,当用户添加完足够的球员后,他按下第二个按钮,这将打开第二个表格,只有一个面板。
现在这个面板需要第二个用户控件,因为只有一个标签。
(这必须是一个用户控件,因为稍后我会添加分数)
所以现在,程序必须读取,用户在 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);
}
}
如您所见,我制作了一个列表,其中应存储名称。
我还有一个代码文件,其中包含:
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 -> UserControl1 -> 数据
Form1 -> Form2 -> 面板 -> UserControl2 -> 数据
所以您应该将数据从 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 class 应该实现这个接口。然后在 Form2 构造函数中等待 IMyData 接口而不是像这样的具体实现:
public Form2(IMyData data)
{
this.InitializeComponent();
this.userControl2.Data = data;
}
这也会在您稍后测试项目以模拟 MyData 时帮助您。
我需要制作一个带有名字的记分牌。
在第一个表单中,您通过用户控件添加玩家。
Button1_click 将 UserControl1 添加到面板中。 UserControl1 只有一个文本框、标签和一个按钮,当插入文本并按下按钮(在 UserControl1 内)时,文本将转移到标签中,并处理按钮和文本框。
现在,当用户添加完足够的球员后,他按下第二个按钮,这将打开第二个表格,只有一个面板。
现在这个面板需要第二个用户控件,因为只有一个标签。 (这必须是一个用户控件,因为稍后我会添加分数) 所以现在,程序必须读取,用户在 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);
}
}
如您所见,我制作了一个列表,其中应存储名称。
我还有一个代码文件,其中包含:
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 -> UserControl1 -> 数据
Form1 -> Form2 -> 面板 -> UserControl2 -> 数据
所以您应该将数据从 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 class 应该实现这个接口。然后在 Form2 构造函数中等待 IMyData 接口而不是像这样的具体实现:
public Form2(IMyData data)
{
this.InitializeComponent();
this.userControl2.Data = data;
}
这也会在您稍后测试项目以模拟 MyData 时帮助您。