格式化和显示来自访问数据库的数据(WPF,C#)

时间:2014-04-06 21:35:53

标签: c# wpf ms-access

晚上好,

重点:在我的WPF应用程序中,我希望以另一个类中创建的ToString方法的格式显示列表框中的访问数据库中的数据。 - 我可以显示数据,但不包含格式。

我的问题的背景: 我正在为大学的评分单元创建一个应用程序,用于添加,删除和显示来自访问数据库的数据。我在向数据库添加或删除数据时没有遇到任何问题,但是,我正在努力以特定格式显示数据。

由于具体要求,我不得不创建一个抽象的Games类,子类为PlatformMobile(游戏)。

我想知道如何在列表框中显示来自访问数据库的数据(虽然这很容易更改),同时将内容格式化为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;
    }

我希望我的问题有意义,并且我已经提供了足够的信息,让您了解我正在尝试做什么。

2 个答案:

答案 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的DisplayMemberValueMemberList<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());