[英]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.