-3

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

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

    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);
    }

当单击按钮时,我该怎么做,另一个表单中的列表会添加项目?

4

5 回答 5

2

实现此目的的两种方法:

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

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

于 2013-09-05T04:27:31.397 回答
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("事物");

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

于 2013-09-05T04:54:58.287 回答
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
        }
    }          
于 2013-09-05T04:35:38.913 回答
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;}}
于 2013-09-05T04:21:49.263 回答
-2

将表单的 listView 设为静态的

公共静态 ListView listview1=........

然后您可以从另一种形式访问该 ListView,如下所示

Form1.listview1.Add(value);

于 2013-09-05T04:25:26.377 回答