2014-11-22 41 views
0

我一直在寻找和尝试一些事情,但没有运气C#添加项目,从另一种形式

我有2种形式的列表视图中,表1有一个ListView和窗体2搜索的项目,如果在窗体2项发现我想将它添加到列表视图在Form1

注意窗体2上的按钮,点击启动从Form1中

Form1的(名字是MainScreen):

// Add item from the add item dialog 
    public void AddFromItemDialog(ListViewItem itms) 
    { 
     listItems.Items.Add(itms); 
    } 

窗体2():

private void btnAdd_Click(object sender, EventArgs e) 
    { 
      MainScreen mainScreen = new MainScreen(); 
      MessageBox.Show("Item Added!"); 

      ListViewItem lvi = new ListViewItem(); 
      lvi.Text = "Item 1"; 
      lvi.SubItems.Add("Second Item"); 

      mainScreen.AddFromItemDialog(lvi); 
    } 

有没有错误,但没有被添加到列表视图形式1

回答

1

你有一个堆栈变量:

MainScreen mainScreen = new MainScreen(); 

当函数退出时,它便会消失。尝试使它成为一个类变量。例如:

private MainScreen mainScreen; 

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    if (mainScreen == null) 
    { 
     mainScreen = new MainScreen(); 

您还必须显示表单,而不仅仅是创建它。

+0

这个工作,但事情是第二种形式作为一个弹出式对话框,形式mainscreen(表格1)永远不会关闭。什么额外展(现在的情况)是创建mainscreen的新实例离开我的相同形式2的一个仅仅有我想 – user3772063 2014-11-22 16:16:07

+0

如果你是说mainScreen已经存在的项目,那么你不应该创建一个新的。公开变量mainScreen并将其分配给现有表单。 – 2014-11-22 16:17:50

+0

@Stevens,我知道这现在听起来stuid我不是所有的避让VIR C#,但我怎么然后把它公开,并作为mainScreen是指实际的形式分配给它,我只是想什么都得到由第二种形式发送要添加到所谓MainScreen – user3772063 2014-11-22 16:21:53

0

我找到了解决办法,就是我想要做的是改变控制器从另一个窗体所以我必须通过第一种形式作为参数传递给第二个形式,所以这是我现在已经和作品。

Form1中:

private void button1_Click(object sender, EventArgs e) 
     { 
      AddItemDialog addItemDialog = new AddItemDialog(this); 
      addItemDialog.Show(); 

     } 

// Add item form the add item dialog 
    public void AddFromItemDialog(ListViewItem itms) 
    { 
     listItems.Items.Add(itms); 
    } 

窗体2:

private MainScreen mainScreen; 

//overloaded constructor with handle to Form1 
    public AddItemDialog(MainScreen frm1) 
    { 
     InitializeComponent(); 

     mainScreen = frm1; 
    } 

private void btnAdd_Click(object sender, EventArgs e) 
{ 
     MessageBox.Show("Item Added!"); 

     ListViewItem lvi = new ListViewItem(); 
     lvi.Text = "Item 1"; 
     lvi.SubItems.Add("Second Item"); 

     mainScreen.AddFromItemDialog(lvi); 
} 
+0

认真吗?这有效吗?您正在使用按钮单击创建MainScreen,并且它超出了范围。什么都不会发送到Form1? – Uwe 2014-11-22 16:46:18

0

您正在创建窗体2新的MainForm,它不是创建窗体2和未因此显示的任何变化形式的实例不可见。当您使用Show或ShowDialog时,您可以选择设置拥有窗体。即

frm2.Show(this); 

然后你可以从你的AddItemDialog表单中访问它。

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("Item Added!"); 
    ListViewItem lvi = new ListViewItem(); 
    lvi.Text = "Item 1"; 
    lvi.SubItems.Add("Second Item"); 
    ((MainScreen)this.Owner).AddFromItemDialog(lvi); 
} 

虽然这样做的正确方法是使用属性和事件的两种形式,这种方式有创建表单的内部知识不需要创建表格链接。