我正在尝试将.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
答案 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();
}
}