【问题标题】:Buttons don't work in Windows Forms C# by using classes通过使用类,按钮在 Windows 窗体 C# 中不起作用
【发布时间】:2016-07-11 20:05:38
【问题描述】:

所以,我目前正在开发一款游戏库应用程序,您可以在其中添加和组织游戏库中的游戏。到目前为止,我有三个文本框(一个用于游戏名称、开发者和发行商)、一个复选框(用于选择游戏所在的平台或系统)、三个按钮(“保存更改”、“添加”和“删除”) ,最后是一个列表视图,只要用户输入信息并单击“添加”按钮,就会显示游戏的标题。我能够使用Form1.csclass 让它毫无问题地工作,但我认为最好使用类来组织代码,这是我以前从未用 Windows 窗体做过的(所以我有点菜鸟在这)。为了这篇文章的一致性原因,我创建了一个saveAddDelete.csclass,其中包含我从Form1.cs 转移过来的“保存”、“添加”和“删除”按钮的所有代码。然后我在指定的按钮点击事件下调用Form1.cs中的saveAddDelete.csclass。没有错误,但是当我运行程序时,我输入信息并单击按钮,但它们什么也没做。所以我认为我要么缺少代码,要么误解了类在 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 { }
        }
    }

【问题讨论】:

  • 在顶部设置其他两个公共变量的位置,创建 saveAddDelete 类的公共变量。然后在您的按钮中,使用该变量来调用您的保存、添加和删除方法。我认为这可能更接近你想要完成的事情。就目前而言,您每次都在为您的类创建一个新的(空)副本,因此在运行它时似乎没有真正发生任何事情,因为您每次都会丢失任何数据。
  • @jpaugh78 在saveAddDelete 中,他正在初始化他的表单类的一个新的空实例,然后从控件中复制空值。他也必须从saveAddDelete 构造函数中的真实形式初始化它。但他最好考虑到整个事情有某种视图/视图模型交易,尽可能多地在 winforms 中。
  • @Ed 我的错。我过于关注表单而不是自定义类。我没听懂。
  • @jpaugh78 有很多事情要做。

标签: c# .net winforms class listview


【解决方案1】:

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

一个选项 - 将Form1 传递给每个调用,而不是在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

【讨论】:

    【解决方案2】:

    在您的 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 中的控件相关。新类通常用于模拟现实世界的对象——而不是分解与现有类相关的各种代码。您的“图书馆”类是对单独类的正确使用,因为它的每个实例都代表一个不同的游戏,并且您需要单独跟踪其中的多个(尽管我将类称为“游戏”而不是“Library”,因为该类的每个实例都代表一个游戏,而单词 library 表示游戏的集合。)

    【讨论】:

    • 我要补充一点,因为saveAddDelete.Save() 没有引用属于saveAddDelete 的属性或字段,所以没有理由不成为static
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2011-04-14
    相关资源
    最近更新 更多