【发布时间】: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