晚上好,
重点:在我的WPF应用程序中,我希望以另一个类中创建的ToString
方法的格式显示列表框中的访问数据库中的数据。 - 我可以显示数据,但不包含格式。
我的问题的背景: 我正在为大学的评分单元创建一个应用程序,用于添加,删除和显示来自访问数据库的数据。我在向数据库添加或删除数据时没有遇到任何问题,但是,我正在努力以特定格式显示数据。
由于具体要求,我不得不创建一个抽象的Games
类,子类为Platform
和Mobile
(游戏)。
我想知道如何在列表框中显示来自访问数据库的数据(虽然这很容易更改),同时将内容格式化为ToString()
中之前创建的Platform
方法和Mobile
课程。据我所知,我可能需要创建两种不同的方法来显示平台和手机游戏,因为它们都有一个额外的变量。
目前,我将listPlatform()
方法存储在我的Catalogue
类中,该类可以从单独的窗口(EmployeeWindow
访问,该窗口包含列表视图框,然后访问此方法,通过button_click
事件调用它。
Catalogue
课程 -
public List<string> listPlatform()
{
List<string> data = new List<string>();
string queryString = "SELECT ID, Game_Name, Developer, Publisher, Genre, Age_Rating, Price, Quantity, Description, Platform FROM GameDetails";
using (OleDbConnection connection = new OleDbConnection(ConnString))
{
OleDbCommand command = new OleDbCommand(queryString, connection);
connection.Open();
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
int id = reader.GetInt32(0);
string gName = reader.GetString(1);
string gDeveloper = reader.GetString(2);
string gPublisher = reader.GetString(3);
string gGenre = reader.GetString(4);
int gAgeRating = reader.GetInt32(5);
var gPrice = reader.GetValue(6);
var gQuantity = reader.GetValue(7);
var gDescription = reader.GetValue(8);
var gPlatform = reader.GetValue(9);
data.Add(id + gName + gDeveloper + gPublisher + gGenre + gAgeRating + gPrice
+ gQuantity + gDescription + gPlatform);
}
reader.Close();
}
return data;
}
EmployeeWindow
-
private void btnDisplay_Click(object sender, RoutedEventArgs e)
{
List<string> data = theCatalogue.listPlatform();
lstvwGames.Items.Clear();
foreach (string s in data)
{
lstvwGames.Items.Add(s);
}
}
Platform
课程 -
/// <summary>
/// Returns a string representation of a Platform game
/// </summary>
/// <returns></returns>
public override string ToString()
{
string strout = string.Format(base.ToString() + "Platform:{0}", platform);
return strout;
}
我希望我的问题有意义,并且我已经提供了足够的信息,让您了解我正在尝试做什么。
答案 0 :(得分:1)
我认为,在这种情况下,您需要在代码中添加另一个类
您可以建模的Game class
查看数据库表中的字段
public class Game
{
public int ID {get;set;}
public string GameName {get;set;}
public string Developer {get;set;}
public string Publisher {get;set;}
public string Genre {get;set;}
public string Age_Rating {get;set;}
public decimal Price {get;set;}
public int Quantity {get;set;}
public string Description {get;set;}
public string Platform {get;set;}
public override string ToString()
{
return this.GameName + " - " + this.Genre;
}
}
现在,在Catalog类中,当您阅读数据库时,您构建的是List<Game>
而不是List<String>
public List<Game> listPlatform()
{
.....
List<Game> games = new List<Game>();
while (reader.Read())
{
Game g = new Game();
g.ID = reader.GetInt32(0);
g.GameName = reader.GetString(1);
... and so on for the rest of fields
games.Add(g);
}
...
return games;
}
最后,当您需要将游戏添加到ListBox时,您可以编写
private void btnDisplay_Click(object sender, RoutedEventArgs e)
{
List<Game> data = theCatalogue.listPlatform();
lstvwGames.Items.Clear();
foreach (Game g in data)
{
lstvwGames.Items.Add(g.ToString());
}
}
你有一个填充GameName和Genre的列表。
编辑完成此回答,
最后,您可以使用DataSource
直接设置ListBox的DisplayMember
,ValueMember
和List<Game>
属性,并且可以删除部分属性填写项目
private void btnDisplay_Click(object sender, RoutedEventArgs e)
{
lstvwGames.ValueMember = "ID";
lstvwGames.DisplayMember = "GameData";
lstvwGames.DataSource = theCatalogue.listPlatform();
}
在此示例中,DisplayMember
属性被分配给您应在Game类中定义的新GameData
字段。这个新的readonly属性可能是同一类的ToString方法的实际返回值或您选择的其他值
public class Game
{
.....
public string GameData
{
// Only a getter, thus readonly
get
{
return this.ToString();
}
}
}
当然,您可以更改Game类中的ToString方法或GameData属性,以返回您真正想要在列表框中显示的信息。
答案 1 :(得分:0)
我没有看到你使用tostring override方法。也许你打算在这里使用它?
lstvwGames.Items.Add(s.ToString());