如何将值从一种形式传递到另一种形式?

时间:2013-11-02 01:01:13

标签: c# winforms listview listviewitem

我有一个MainForm和AnotherForm。可以通过MainForm的menuItem访问AnotherForm。

AnotherForm有listView。当用户点击某个项目时,我想获取字符串元素并将其传递给MainForm的文本框,因此该元素显示在那里并且AnotherForm已关闭。到目前为止,AnotherForm已关闭,但MainForm的文本框中没有显示任何内容。有什么建议吗?

private void listView1_ItemActivate(object sender, EventArgs e)
{
    string input = listView1.SelectedItem[0].ToString();
    MainForm mainF = new MainForm(input);// called the constructor
    this.Close(); //close this form and pass the input to MainForm
    mainF.inputTextBox.Text = input;
    mainF.loadThis(input);
}

3 个答案:

答案 0 :(得分:0)

我假设您已经有MainForm的实例,这就是创建AnotherForm实例的原因。

在您发布的活动中,您实际上正在创建一个全新的MainForm实例,从不显示它,然后当AnotherForm关闭时它就会被销毁。

您在文本框中看不到任何内容的原因是因为您正在查看MainForm的原始实例,而您实际上并未对其进行更改。

解决这个问题的一种简单方法是将原始MainForm的引用传递给AnotherForm

public class AnotherForm
{
    private MainForm mainF;

    public AnotherForm(MainForm mainF)
    {
        this.mainF = mainF;
    }

    ...
    ...

    private void listView1_ItemActivate(object sender, EventArgs e)
    {
        ...
        mainF.inputTextBox.Text = input;
        ...
    }
}

注意:您可能希望切换它并在AnotherForm中创建一个公共属性,而不是让MainForm知道AnotherForm

public class AnotherForm
{
    public InputValue { get; private set; }

    private void listView1_ItemActivate(object sender, EventArgs e)
    {
        ...
        InputValue = input;
        ...
    }
}

然后,当其他表单关闭时,您可以从MainForm访问该文件:

private void SomeMethodInMainForm()
{
    var newAnotherForm = new AnotherForm();

    newAnotherForm.ShowDialog();

    var inputValueFromAnotherForm = newAnotherForm.InputValue;

    // do something with the input value from "AnotherForm"
}

答案 1 :(得分:0)

如果您的MainForm已经创建,则无法创建另一个,以便访问它并设置属性。你已经创建了两个单独的MainForm(虽然第二个被隐藏,因为你从未展示过它)。

听起来你想做的是模态对话模式。您的MainForm是应用程序中的主窗口。您希望在单击菜单链接时弹出第二个表单。这称为对话框。然后,当您关闭该对话框时,您希望MainForm检索一个值作为对话框的返回结果。

在您的MainForm中,处理菜单项click的事件处理程序应如下所示:

private void pickSomethingMenuItem_Click(object sender, EventArgs e)
{
    using (var picker = new PickerDialog())
    {
        if (picker.ShowDialog(this) == DialogResult.OK)
        {
            LoadSomething(picker.SomethingPicked);
        }
    }
}

然后,以下代码将出现在对话框中:

public string SomethingPicked { get; private set; }

private void somethingListView_ItemActivate(object sender, EventArgs e)
{
    SomethingPicked = somethingListView.SelectedItem[0].ToString();
    DialogResult = DialogResult.OK;
}

注意我是如何用有意义的名字命名所有对象的。好吧,除了“Something”。从您的代码中无法判断您实际使用的对话框是什么。您应该始终为对象和变量使用有意义的名称。你的代码几乎完全没有意义。

你几乎不应该像对待inputTextBox一样对公开表格进行控制。您应该始终将要共享的值公开为公共属性。

答案 2 :(得分:0)

在这个呈现的解决方案中,你可以做五件事,以达到你想要做的,即:

 1) Declare a global object for AnotherForm in MainForm
 2) Initiate a FromClosing event handler for AnotherForm in MainForm
 3) Make a public property or field in AnotherForm
 4) Before closing in AnotherForm you save it the public property mentioned above
 5) In the MainForm get the public property from AnotherForm

以下是代码:

<强>的MainForm

public partial class MainForm : Form
{
    AnotherForm anotherForm; // Declare a global object for AnotherForm

    public MainForm()
    {
        InitializeComponent();
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e)
    {
        anotherForm = new AnotherForm(); // when Menu Item is clicked instantiate the Form
        anotherForm.FormClosing += new FormClosingEventHandler(anotherForm_FormClosing); // Add a FormClosing event Handler
        anotherForm.ShowDialog();
    }

    void anotherForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        inputTextBox.Text = anotherForm.listViewValue; // get the Value from public property in AnotherForm
    }
}

<强> AnotherForm

 void listView1_ItemActivate(object sender, EventArgs e)
 {
    listViewValue = listView1.SelectedItems[0].Text; // Get the listViewItem value and save to public property
    this.Close(); // Close
 }

 public String listViewValue { get; set; } // public property to store the ListView value

与您的代码相比,我需要注意的一点是ToString()中没有使用ListView.SelectedItems

listView1.SelectedItems[0].ToString();

但请使用Text属性:

listView1.SelectedItems[0].Text;