从一个表单中取出组合框项,并将其名称作为文本添加到另一个表单中
本文关键字:表单 另一个 添加 文本 一个 组合 | 更新日期: 2023-09-27 18:08:53
好的,所以我试图创造一个简单的游戏。简而言之,这是一款资源管理游戏,玩家将尝试管理盗贼公会。关于执行任务,我已经创建了一个贼类,当一个新的贼被招募时,就会创建一个新的实例。我在盗贼职业中加入了获得经验和升级的能力。
我的具体问题是:我希望玩家能够选择派遣哪个小偷执行任务。我考虑了一下,发现打开一个新表单并用复选框填充它是最简单的方法。这些复选框将与小偷的List<thief>
相关,玩家然后检查他想要发送的小偷,这些然后存储在另一个List<thief>
中并传递给运行任务函数。
我已经建立了一个单独的项目,目的是在将其放入主程序之前进行测试和试用。测试项目由两个表单组成:第一个(frmMain
)有一个文本框来保存所选的选项和一个按钮来打开第二个表单(frmSelect
)。目前,我可以打开并填充第二个表单(frmSelect
),但当我尝试将选中的选项添加到文本框时,我只是…不能。
到目前为止,我已经尝试通过在frmSelect
的cs文件中输入frmMain.txtOptionsDisplay
直接访问文本框,但它会导致以下错误:
非静态字段、方法或地产
我试图在frmSelect
中创建一个新表单,并使其等于frmMain
的活动实例:Form frmTemp = frmMain.ActiveForm;
,然后使用frmTemp
作为中间人更改文本框,但产生了错误:
System.Windows.Forms。的定义"txtOptionsDisplay"。
在搜索了google和stackoverflow论坛后,我遇到了我从未听说过的答案(Threading)或我已经认识到但无法解释粘贴的代码以使其与我的问题(delegate)相关的答案。
任何建议或指示将是非常棒的。
编辑:frmMain代码:
public frmMain()
{
InitializeComponent();
selections.Add("Option 1");
selections.Add("Option 2");
}
private void btnClick_Click(object sender, EventArgs e)
{
frmSelectOptions.Show();
int length = selections.Count();
for (int i = 0; i < length; i++)
{
CheckBox box = new CheckBox();
box.Text = selections[i];
box.AutoSize = true;
box.Location = new Point(50, 50*(i+1));
frmSelectOptions.grpControls.Controls.Add(box);
}
}
public void updateText(string option)
{
txtOptionsDisplay.Text += option;
}
}
frmSelect代码:
public List<CheckBox> selectedOptions = new List<CheckBox>();
Form frmTemp = frmMain.ActiveForm;
public frmSelect()
{
InitializeComponent();
}
private void btnSelect_Click(object sender, EventArgs e)
{
foreach (CheckBox box in grpControls.Controls)
{
if (box.Checked == true)
selectedOptions.Add(box);
}
this.Hide();
}
}
我希望这个格式正确…我是新手,不知道怎么缩进。哦,看,这是一个预览…
这有帮助吗?
您的问题是,默认情况下,在表单中定义的控件接收私有访问标识符。因此你可以在
这一行添加一个属性public ControlType ProxyProperty {
get {
return txtOptionsDisplay;
}
}
除此之外,你应该考虑一下你所尝试的是否是一个好的解决方案。从一个表单到另一个表单的操作在以后的维护中会变得非常麻烦。
我建议对你的frmMain使用Singleton模式。这将有助于防止您意外启动另一个frmMain实例,同时,将使您能够访问frmMain的对象。从那里,您可以为Get您的txtOptionsDisplay编写访问器,也可以将其设置为公共。下面是一个例子:
public class frmMain
{
private static frmMain Instance = null;
private static object LockObj = new object();
public static frmMain GetMain()
{
// Thread-safe singleton
lock(LockObj)
{
if(Instance == null)
Instance = new frmMain();
return Instance;
}
}
public string GetOptionsDisplayText()
{
return txtOptionsDisplay.Text;
}
}
public class frmSelect
{
private void frmSelect_Load(object sender, EventArgs e)
{
// Set whatever text you want to frmMain's txtOptionsDisplay text
txtDisplay.Text = frmMain.GetMain().GetOptionsDisplayText();
}
}
如果你选择这条路,不要忘记更新Program.cs以使用frmMain的单例。
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Application.Run(new frmMain()); - Old method
Application.Run(frmMain.GetMain());
}