如何使一个窗体中的按钮影响另一个窗体的列表视图

本文关键字:窗体 另一个 列表 视图 影响 按钮 何使一 | 更新日期: 2023-09-27 18:30:10

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

这是我当前的代码,请记住,在这段代码中,按钮的形式与列表视图相同,我想移动到一个新的:

    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公开为Form本身的属性,并通过Form 引用它

来自Form1

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

在Form2中,添加以下包装以暴露原始列表查看

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

实现这一点的两种方法:

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

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

假设您有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上面的回答的基础上,您可以实现域事件模式(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");

有了这一点,您必须记住,事件很容易导致内存泄漏。如果您注册了它,请确保您注销了它。

make listView of form as a static one

公共静态ListView listview1=。。。。。。。。

然后您可以从另一个表单访问ListView,如下面的

Form1.listview1.Add(value);