C# 如何使一个窗体中的按钮影响另一个窗体中的listview?

C# 如何使一个窗体中的按钮影响另一个窗体中的listview?,c#,listview,C#,Listview,我希望在一个表单中有按钮,然后当我单击它们时,一个项目被添加到另一个表单中的列表中 这是我当前的代码,请记住,在这段代码中,按钮的形式与listview相同,我想将其中一个移动到新的: private void button2_Click(object sender, EventArgs e) { listView1.Items.Add("Panama"); } private void button3_Click(object sender,

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

这是我当前的代码,请记住,在这段代码中,按钮的形式与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);
    }

当单击按钮时,另一个表单中的列表将添加该项,如何执行此操作?

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

来自表格1

private void button4_Click(object sender, EventArgs e)
    {
        Form2Instance.MyListView.Items.RemoveAt(0);
    }
在Form2中,添加以下包装以公开原始listView

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

将窗体的listView设置为静态窗体

公共静态ListView listview1=

然后您可以从另一个表单访问该列表视图,如下所示


Form1.listview1.Add(值)

实现这一点的两种方法:

首先,您有一个对另一个表单及其listview的引用,并在当前表单中单击按钮时调用listview以立即添加/删除项


第二个使用事件:单击按钮时,引发另一个表单订阅的事件,并在处理程序中执行任意操作(例如根据事件数据向列表视图添加/删除项)。对于事件,ref:

假设您有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
        }
    }          

请不要仅仅为了将项目添加到列表中而从一个表单引用另一个表单。:)

基于以上Rex的答案,您可以实现域事件模式()

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

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.FireEvent(“Thing”)


因此,您必须记住,事件很容易导致内存泄漏。如果您注册了它,请确保取消注册。

它可以工作,但它会给我一个错误“ein.Form2.listView1”由于其保护级别而无法访问“我如何修复它?”?抱歉,这是我的第一个C#项目,请将其改为公共财产,以便您可以访问它。如果您的ListView被声明为私有属性,您将无法从类外部访问它Yeah!将所有内容都设置为静态也是一种选择。请记住,这将在多次打开和关闭的窗体之间保持状态。静态通常不是一个好主意
DomainEventSource.Instance.AddItem += ( s, a ) => Console.WriteLine( "Event fired with name: " + a.ItemName );