Установить возвращаемое значение из метода как открытую строку - PullRequest
4 голосов
/ 16 декабря 2010

Я пытаюсь передать значение между формами - в данном случае это результат выделенной ячейки в DataGridView.

В основной форме я получаю значение с помощью метода открытых строк:

    public string GetCaseID()
    {
        int i;
        i = dgCases.SelectedCells[0].RowIndex;
        string caseid = dgCases.Rows[i].Cells[1].Value.ToString();
        string version = dgCases.Rows[i].Cells[2].Value.ToString();
        return version + "_c" + caseid;
    }

    //Form2 is launched
    private void btnEvLvlUserSelect_Click(object sender, EventArgs e)
    {
        Form2 form2= new Form2();
        form2.ShowDialog();
    }

Поскольку GetCaseID () объявлен как открытая строка, я смогу вызвать его из моегоForm2, верно?

В Form2 у меня просто так:

    private void button1_Click(object sender, EventArgs e)
    {
        //Take selected case information
        fmHome fmhome = new fmHome();
        textBox1.Text = fmhome.GetCaseID();
    }

Я знаю, что кросс-форма работает: если я заменяю GetCaseID () простой старой строкой, она показываеткак и ожидалось в Form2.

Может быть, это связано с необходимостью объявить dgCases как общедоступные?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 16 декабря 2010

В button1_Click вы создаете новый экземпляр класса fmHome. Это отличный экземпляр от экземпляра fmHome, который его создал, поэтому у него нет выделенной строки в dgCases. Вызов GetCaseID() в этом случае не вернет то, что вы ожидаете.

Ваш обработчик button1_Click должен иметь возможность вызывать GetCaseID() в форме, которая его открыла. Очень простой способ - добавить свойство, подобное этому, на Form2:

public fmHome fmHomeParent { get; set; }

Затем, когда вы откроете свой экземпляр Form2, сделайте следующее:

private void btnEvLvlUserSelect_Click(object sender, EventArgs e)
{
    Form2 form2= new Form2();
    form2.fmHomeParent = this;
    form2.ShowDialog();
}

Таким образом, в вашем обработчике button1_Click вы можете получить доступ к этому экземпляру вместо создания нового:

private void button1_Click(object sender, EventArgs e)
{
    //Take selected case information
    textBox1.Text = fmHomeParent.GetCaseID();
}

Надеюсь, это поможет!

1 голос
/ 16 декабря 2010

Вы создаете новый экземпляр fmHome в button1_Click, поэтому он не содержит исходную сетку данных.

Вы можете передать экземпляр таблицы данных в качестве параметра конструктору Form2.

Примечание: то, как вы смешиваете представление и данные, приводит к не поддерживаемому коду и не является хорошей практикой ... но я предполагаю, что вы имеете дело с устаревшим кодом?

0 голосов
/ 16 декабря 2010

Вы также можете сделать следующее:

//Form2 is launched
private void btnEvLvlUserSelect_Click(object sender, EventArgs e)
{
    Form2 form2= new Form2(this.GetCaseID());
    form2.ShowDialog();
}

Затем в форме 2:

public partial class PlayerInfo : Form
{
    string caseID;
    public Form2(string fmHomeCaseID)
    {
        caseID = fmHOmeCaseID;
    }


    // Button Click in your second form
    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = caseID;
    }
}

Что вы также можете сделать, это создать класс, содержащий всю информацию, котораятребуется для вашего приложения, а затем заполните его, где это необходимо, и получите данные из него в другой форме, не подключая их обоих.Но я не знаю, является ли это лучшим решением.

0 голосов
/ 16 декабря 2010

Создание нового экземпляра, как вы делаете, не получит никакого значимого значения.

Вместо этого убедитесь, что Form2 может получить ссылку на исходный экземпляр fmHome. Самый распространенный шаблон - добавить (приватную) Form2 переменную-член типа fmHome и установить ее как часть Form2 конструктора (ов), требуя от создателя передать его (в вашем случае, в btnEvLvlUserSelect_Click. Затем вы можете использовать этот элемент в вашем Form2.button1_Click() методе вместо создания новой (невидимой) пустой формы.

...