2014-12-02 3 views
0

Я пытаюсь передать .SelectedText (желательно) или .SelectedItem из ComboBox в моей основной форме DetailerReports в мой логический класс Math.cs. Я работал и искал несколько часов, и я надеюсь, что кто-то направит меня дальше. Я перешел от Math к DetailerReport, но не наоборот, поэтому я думал, что это будет похоже. Я пробовал несколько вариантов, хотя я думаю, что это самое близкое, но не в настоящее время работающее решение. Я объявляю параметр публично и пытаюсь присвоить значение, когда событие SelectedIndexChanged срабатывает для cbSelectProject COMBOBOXПередайте параметр ComboBox.SelectedText другому классу

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

+1

Вам нужен экземпляр 'DetailerReport', тогда ваш подход будет работать так, как ожидалось. – Sinatr

+0

Я не уверен, что понимаю, как реализовать и экземпляр 'DetailerReport'. Не могли бы вы расширить свой ответ? Я был бы очень признателен. Благодарю за ваш ответ. :-D –

+0

Я не знаю, как выглядит ваша Math.cs, но для обеспечения этой функции можно сделать несколько вещей. Вы можете создать собственный класс EventArgs, который заключает в себе те значения, которые вам нужны, и передавать их как объект. Другим вариантом является расширение вашей указанной Math.cs, чтобы он мог принять объект. Другим вариантом было бы привязать объект. –

ответ

2
string cbSelectProjectValue = DetailerReports.cbSelectProject_SelectedIndexChanged(); 

Это не будет работать, так как это публичный метод (= не может быть доступ статический) и это метод, который вызывается событием.

string cbSelectProjectValue = DetailerReports.cbSelectedProjectValue; 

Это также не сработает, так как вы не можете получить доступ к этой публичной переменной статически.

Если вы хотите обмениваться значениями, вы можете сделать это, изменив модификатор на static, но это не очень хорошее решение.

public static string cbSelectedProjectValue = ""; 

Было бы лучше обменивать это значение по параметрам методов. Такие, как

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

где Math.doSomething() ожидает строку.

EDIT:

Как вам необходимо передавать значения между формами, это хорошая идея, чтобы использовать понятие «контроллер». В следующей реализации я использовал 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; 
} 
+0

Я не знаю, что это можно избежать, но я надеюсь избежать этого. Меня беспокоит то, что мне придется передать эту строку в «Math.doSomething» из других форм. FYI Я строю небольшое отслеживание времени HR, которое позволит пользователю получить доступ к их времени для создания диаграмм, чтобы помочь им. Конечно, Supv хочет отслеживать все время, поэтому диаграммы могут быть дикими. Я надеюсь повторно использовать 'Math.doSomething()' для этой цели. Обработка .... –

+0

И СПАСИБО ВАМ очень для ответа. Я очень, очень ценю это. :-D –

+0

Добро пожаловать! Я отредактировал свой ответ и добавил дополнительный код. Надеюсь, поможет. – rogi1609

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) будет использовать его в качестве держателя данных.

Но в случае методов вы обречены на использование интерфейсов. Каждая форма должна реализовать этот интерфейс. Что-то вроде

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(); 
    } 
} 
Смежные вопросы