将 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
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();
}
}