将 ComboBox.SelectedText 参数传递给另一个类

本文关键字:另一个 参数传递 ComboBox SelectedText | 更新日期: 2023-09-27 18:32:43

我正在尝试将.SelectedText(最好(或.SelectedItem从我的主窗体 DetailerReports 上的 ComboBox 传递到我的逻辑课 Math.cs。我已经工作和搜索了几个小时,我希望有人能进一步指导我。我一直在从数学转到DetailerReport,但不是相反,所以我认为它会是相似的。我已经尝试了几种选择,尽管我认为这是最接近但目前无法运行的解决方案。我正在公开声明参数,并尝试在为 comboBox 触发 SelectedIndexChanged 事件时分配值cbSelectProject

public partial class DetailerReports : Form
{
    public string cbSelectedProjectValue = "";
    public void cbSelectProject_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (cbSelectedProjectValue == "")
        {
            cbSelectedProjectValue = cbSelectProject.SelectedText;
            MessageBox.Show(cbSelectedProjectValue);
        }
        //return cbSelectedProjectValue;
    }
}

我希望返回值cbSelectedProjectValue并将其传递给我的Math.cs以用作变量

string cbSelectProjectValue = DetailerReports.cbSelectProject_SelectedIndexChanged();

string cbSelectProjectValue = DetailerReport.cbSelectedProjectValue;

这些都不起作用。如果有人能指出我正确的方向,我将不胜感激。提前感谢您的时间和考虑。祝你有美好的一天!!:-D

将 ComboBox.SelectedText 参数传递给另一个类

string cbSelectProjectValue = DetailerReports.cbSelectProject_SelectedIndexChanged();

这是行不通的,因为这是一个公共方法(=不能静态访问(,它是一个由事件调用的方法。

string cbSelectProjectValue = DetailerReports.cbSelectedProjectValue;

这也行不通,因为您无法静态访问此公共变量。

如果您想交换值,可以通过将修饰符更改为静态来做到这一点,但这不是一个很好的解决方案。

public static string cbSelectedProjectValue = "";

最好通过方法参数交换此值。如

public void cbSelectProject_SelectedIndexChanged(object sender, EventArgs e)
{
     Math.doSomething(cbSelectProject.SelectedText);
}

其中 Math.doSomething(( 需要一个字符串。

编辑:

由于需要在窗体之间传递值,因此最好使用"控制器"的概念。在下面的实现中,我使用 MyController 存储两个属性。现在,每当实例化新窗体时,MyController 引用都会作为参数传递,并且可以从每个窗体访问 MyController 实例的公共变量。

程序.cs

[STAThread]
static void Main()
{
    //instanciate MyController for further use
    controller = new MyController();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormMain(controller));
}
private static MyController controller;

我的控制器.cs

public class MyController
{
    //store values here, which are needed accross various Forms
    public string A { get; set; }
    public int B { get; set; }
}

表单主.cs

MyController controller;
public FormMain(MyController controller)
{
    InitializeComponent();
    this.controller = controller; //Assign the controller to have access to stored variables
}
private void btnStartSecondForm_Click(object sender, EventArgs e)
{
    //access and get/set values here
    string importantValue = controller.A;
    controller.B = 1;
    FormSecond formSecond = new FormSecond(controller);
    formSecond.Show();
}

形式第二.cs

MyController controller;
public FormSecond(MyController controller)
{
    InitializeComponent();
    this.controller = controller; //Same here
    //access values here that you have previously set in FormMain
    int valueFromOtherForm = controller.B;
}

如果你像这样定义公共字段/属性/方法

public partial class DetailerReports : Form
{
    public string SomeField = ""; // not recommended, better use properties
    public string SomeProperty { get; set; }
    public void SomeMethod(...) {...}
}

那么你需要实例

var form = new DetailerReport(); // somewhere you create instance of DetailerReport
form.ShowDialog();

以访问它们

DetailerReport.SomeField = "123"; // will not work
form.SomeField = "123"; // is ok

您必须将该实例存储在某个地方或将其传递给 Math .从您的最后一条评论中,最好创建Math类的多个实例(每个表单(,然后Math可以使用接受该表单实例的构造函数。

对于属性,您也可以在Math中定义它们,以便表单(创建自己的Math实例(将其用作数据的持有者

但是在方法的情况下,你注定要使用接口。每个窗体都必须实现该接口。类似的东西

public interface IBaseForm
{
    void SomeMethod1();
    void SomeMethod2(bool someParameter);
    string SomeProperty { get; set; } 
}
public class DetailerReport: Form, IBaseForm
{
    Math _math;
    public DetailerReport()
    {
        InitializeComponents();
        _math = new Math(this);
    }
    // impolement IBaseForm
    public void SomeMethod1() { ... }
    ...
}
public class Math
{
    IBaseForm _form;
    public Math(IBaseForm form)
    {
        _form = form;
        // and then you can use call methods
        _form.SomeMethod1();
    }   
}