从一个表单中取出组合框项,并将其名称作为文本添加到另一个表单中

本文关键字:表单 另一个 添加 文本 一个 组合 | 更新日期: 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());
    }