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

时间:2014-12-02 12:44:39

标签: c# winforms combobox

我正在尝试将.SelectedText(最好)或.SelectedItem从我的主要表单DetailerReports上的ComboBox传递到我的逻辑类Math.cs.我现在一直在工作和寻找几个小时,我希望有人会指导我。我已经从Math传递到DetailerReport,但不是相反,所以我认为它会类似。虽然我认为这是最接近但目前尚未正常运行的解决方案,但我尝试过多种选择。我公开声明参数并尝试在为cbSelectProject comboBox触发SelectedIndexChanged事件时分配值

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

2 个答案:

答案 0 :(得分:2)

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实例的公共变量。

<强> Program.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;

<强> MyController.cs

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

<强> FormMain.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();
}

<强> FormSecond.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;
}

答案 1 :(得分:0)

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

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实例)将其用作 holder 数据。

但是在方法的情况下,你注定要使用接口。每个表单都必须实现该接口。像

这样的东西
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();
    }   
}