繁体   English   中英

通过使用类,按钮在Windows Forms C#中不起作用

[英]Buttons don't work in Windows Forms C# by using classes

因此,我目前正在开发一个游戏库应用,您可以在其中添加和组织属于游戏库的游戏。 到目前为止,我有三个文本框(一个用于游戏标题,开发者和发行者),一个复选框(用于选择游戏所在的平台或系统),三个按钮(“保存更改”,“添加”和“删除”) ,最后是一个列表视图,每当用户输入信息并单击“添加”按钮时,游戏标题就会显示在该列表视图中。 我可以使用Form1.cs类使它正常工作,但认为最好使用类来组织代码,而我以前从未使用过Windows Forms来做到这一点(所以我有点菜鸟在这)。 出于一致性原因,我制作了一个saveAddDelete.cs类,其中包含我的所有“保存”,“添加”和“删除”按钮代码,这些代码是我从Form1.cs转移过来的。 然后,在指定的按钮单击事件下,在Form1.cs调用saveAddDelete.cs类。 没有错误,但是当我运行该程序时,我输入了信息并单击了按钮,但是它们什么也不做。 因此,我想我要么缺少代码,要么误解类在Windows窗体中的工作方式。 这是下面的代码,如果有人有任何有用的反馈对我有帮助,我将不胜感激。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GameLibrary
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public List<Library> Game = new List<Library>();
        public Library lib = new Library();

        public void saveBttn_Click(object sender, EventArgs e)
        {
            saveAddDelete save = new saveAddDelete();
            save.Save();
        }

        private void button1_Click(object sender, EventArgs e)//Add Button
        {
            saveAddDelete add = new saveAddDelete();
            add.Add();
        }

        private void deleteBtnClick_Click(object sender, EventArgs e)
        {
            saveAddDelete delete = new saveAddDelete();
            delete.Delete();
        }

    public class Library
        {
            public string gametitle
            {
                get;
                set;
            }
            public string developer
            {
                get;
                set;
            }
            public string publisher
            {
                get;
                set;
            }
            public string platform
            {
                get;
                set;
            }
        }

class saveAddDelete
    {
        Form1 f = new Form1();
        public void Save()
        {
            if(f.gameList.SelectedItems.Count == 1)
            {
                f.Game[f.gameList.SelectedItems[0].Index].gametitle = f.titleText.Text;
                f.Game[f.gameList.SelectedItems[0].Index].developer = f.developerText.Text;
                f.Game[f.gameList.SelectedItems[0].Index].publisher = f.publisherText.Text;
                f.Game[f.gameList.SelectedItems[0].Index].platform = f.platformCheckBox.CheckedItems.ToString();
            }
        }

        public void Add()
        {
            f.lib.gametitle = f.titleText.Text;
            f.lib.developer = f.developerText.Text;
            f.lib.publisher = f.publisherText.Text;
            f.lib.platform = f.platformCheckBox.CheckedItems.ToString();
            f.Game.Add(f.lib);
            f.gameList.Items.Add(f.lib.gametitle);
            f.titleText.Clear();
            f.developerText.Clear();
            f.publisherText.Clear();
            foreach(int i in f.platformCheckBox.CheckedIndices)
            {
                f.platformCheckBox.SetItemCheckState(i, CheckState.Unchecked);
            }
        }

        public void Delete()
        {
            Remove();
            f.titleText.Clear();
            f.developerText.Clear();
            f.publisherText.Clear();
            foreach (int i in f.platformCheckBox.CheckedIndices)
            {
                f.platformCheckBox.SetItemCheckState(i, CheckState.Unchecked);
            }
        }

        void Remove()
        {
            try
            {
                f.gameList.Items.Remove(f.gameList.SelectedItems[0]);
                f.Game.RemoveAt(f.gameList.SelectedItems[0].Index);
            }
            catch { }
        }
    }

您的帮助程序类没有引用实际执行的表单单击(因此不会从表单中获取任何值)。

一个选项-将Form1传递给每个调用,而不是在saveAndDelete类中saveAndDelete Form1

 class saveAddDelete 
 {
   // Form1 f = new Form1(); - delete that line
   public void Save(Form1 f) {....} // pass Form1

并在每个事件处理程序中传递this

    public void saveBttn_Click(object sender, EventArgs e)
    {
        saveAddDelete save = new saveAddDelete(this);
        save.Save();
    }

请注意,您可以根据自己的目标考虑使用static方法进行Save

在您的Form1代码中,您将创建一个类型为SaveAddDelete的新子对象,但是当您使用所创建的方法时,您不会将任何数据传递给它们。 而是,您正在创建一个新的(空)Form1实例,该实例没有要保存或删除的任何数据,并且,如果您对该新Form1进行了任何修改,则Form1的原始版本将看不到那些更改。 您将获得2个不同的Form1,但它们都不了解另一个。

如果您想通过这种方式进行操作,则需要将对现有Form1的引用传递给SaveAddDelete类:

public void saveBttn_Click(object sender, EventArgs e)
{
    saveAddDelete save = new saveAddDelete();
    save.Save(this);
}

并且您的SaveAddDelete方法将必须期望接收Form1类型的对象:

public void Save(Form1 f)
{
    if(f.gameList.SelectedItems.Count == 1)
    {
        f.Game[f.gameList.SelectedItems[0].Index].gametitle = f.titleText.Text;
        f.Game[f.gameList.SelectedItems[0].Index].developer = f.developerText.Text;
        f.Game[f.gameList.SelectedItems[0].Index].publisher = f.publisherText.Text;
        f.Game[f.gameList.SelectedItems[0].Index].platform = f.platformCheckBox.CheckedItems.ToString();
    }
}

请注意,在最上面的示例中,我将“ this”传递给该方法,该方法是“无论什么类都在调用该代码”的C#代码。 在这种情况下,“ this”是指您现有的Form1对象。 在底部的示例中,请注意save方法将一个名为“ f”的Form1对象作为参数。 它不会创建新的Form1-它使用传递给它的表单。

对于此示例,我实际上只是将所有这些方法留在Form1类中,因为它们都与Form1中的控件相关。 新类通常用于对现实世界的对象进行建模-不会破坏与现有类相关的各种代码。 您的“库”类是对单独类的正确使用,因为它的每个实例代表一个不同的游戏,并且您需要单独跟踪多个类(尽管我将类称为“游戏”而不是“库”,因为该类的每个实例代表一个游戏,而词库则表示游戏的集合。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM