如何从一个表单中创建按钮会影响另一个表单中的列表视图?

时间:2013-09-05 04:17:31

标签: c# listview

我希望在一个表单中有按钮,然后当我点击它们时,一个项目被添加到另一个表单的列表中。

这是我当前的代码,请记住,在此代码中,按钮与listview的格式相同,我想要移动到新的代码:

    private void button2_Click(object sender, EventArgs e)
    {
        listView1.Items.Add("Panama");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        listView1.Items.Add("Brazil");
    }

    private void button4_Click(object sender, EventArgs e)
    {
        listView1.Items.RemoveAt(0);
    }

单击按钮时如何执行此操作,另一种形式的列表会添加项目?

5 个答案:

答案 0 :(得分:2)

您需要从调用操作的表单中引用其他表单。 一种方法是将ListView作为Form本身的属性公开,并通过Form

引用它

来自Form1

private void button4_Click(object sender, EventArgs e)
    {
        Form2Instance.MyListView.Items.RemoveAt(0);
    }

在Form2中添加以下包装器以显示原始listView

public ListView MyListView{get{return this.ListView1;}}

答案 1 :(得分:2)

实现这一目标的两种方法:

首先你引用另一个表单及其列表视图,并在当前表单中单击按钮时调用listview直接添加/删除项目。

第二次使用事件:当点击按钮时,引发一个由另一个表格订阅的事件,并在处理程序中,做任何你喜欢的事情(例如根据事件数据添加/删除项目到列表视图) 。对于活动,参考:http://msdn.microsoft.com/en-us/library/wkzf914z(v=vs.100).aspx

答案 2 :(得分:2)

假设你有Form1和Form2,其中Form1是带按钮的那个,Form2包含ListView。在创建Form2时,您必须在Form1中保存对此Form2实例的引用。

public class Form1
    {
        private Form2 form2;

        public Form1()
        {
            this.form2 = new Form1();
            this.form2.Show();
        }
    }

    public class Form2
    {
        public Form2()
        {

        }

        public void AddItemToListView(string itemName)
        {
            // Check if itemName is valid and add it to your listView
        }
        public void RemoveItemFromListViewAt(int position)
        {
            // Check if the position is valid and remove the item at the position
        }
    }          

答案 3 :(得分:2)

请不要在另一个表单中引用一个表单,只是为了将一个项目添加到列表中。 :)

根据上面的Rex答案,你可以实现域事件模式(http://www.martinfowler.com/eaaDev/DomainEvent.html

一个简单的(基本的)实现将有一个单例类来管理事件的事件/触发:

using System;

/// <summary>
/// Class representing a single source for domain events within an application.
/// </summary>
public class DomainEventSource
{
    #region Fields

    private static readonly Lazy<DomainEventSource> source = new Lazy<DomainEventSource>( () => new DomainEventSource() );

    #endregion

    #region Properties

    /// <summary>
    /// Gets a reference to the singleton instance of the <see cref="DopmainEventSource"/> class.
    /// </summary>
    /// <value> A<see cref="DomainEventSource"/> object.</value>
    public static DomainEventSource Instance
    {
        get
        {
            return source.Value;
        }
    }

    #endregion

    #region Methods

    /// <summary>
    /// Method called to indicate an event should be triggered with a given item name.
    /// </summary>
    /// <param name="name">A <see cref="string"/> value.</param>
    public void FireEvent( string name )
    {
        if ( this.AddItem != null )
        {
            this.AddItem( source, new AddItemEvent( name ) );
        }
    }

    #endregion

    #region Events

    /// <summary>
    /// Event raised when add item is needed.
    /// </summary>
    public EventHandler<AddItemEvent> AddItem;

    #endregion
}

然后连接并调用以下事件:

DomainEventSource.Instance.AddItem += ( s, a ) => Console.WriteLine( "Event fired with name: " + a.ItemName );

DomainEventSource.Instance.FireEvent(“Thing”);

有了这个,你必须记住,事件是内存泄漏的一个简单来源。如果您注册了这个,请确保取消注册。

答案 4 :(得分:-2)

将表单列表视为静态表单

public static ListView listview1 = ........

然后您可以从其他表单访问该ListView,如下所示

Form1.listview1.Add(值);