我有一个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);
}
答案 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;