65.9K
CodeProject 正在变化。 阅读更多。
Home

Pocket PC 个人 MP3 唱片目录搜索工具

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.33/5 (3投票s)

2005年9月21日

CPOL

2分钟阅读

viewsIcon

45198

downloadIcon

518

搜索 MP3 音乐目录的 Windows Mobile 应用程序。

Sample Image - PocketCatalogue.gif

引言

这个应用程序本质上是一个搜索工具,用于查找我想听的音乐专辑位于哪个光盘编号上。该应用程序还包含从中央数据库服务器(通过WebService)下载其数据的功能。

我仍在积极开发这个项目,所以请提供您的建设性意见和设计建议。目前,这个应用程序非常专业化,只满足我的需求,但如果大家有足够的兴趣(以及好的设计方向建议),我可以很容易地被说服来更新和改造这个项目。

框架说明

特别说明:感谢CodeProject上的以下文章。它对我帮助很大(而且我借鉴了他们代码的一部分)。

背景

我拥有大量的MP3文件,我将它们按专辑文件夹排序,并刻录到CD-R上,以便在我的汽车立体声音响中使用。当我拥有100张光盘(超过900张专辑)时,我意识到我需要一种更好的方法来查找我想听的音乐。因此,我在我的服务器上创建了一个MySQL数据库,并在我的袖珍PC上创建了一个搜索工具。

代码片段

用于创建在袖珍PC上使用的数据库的代码的一部分

// This code is in the frmMain_Load event of the frmMain class
PocketCatalogue.Database myDB;
myDB = new Database(PathToDatabase,DatabaseName);
myDB.CreateDB();

// This code is in the Database class
public void CreateDB() {
    if (!System.IO.File.Exists(_pathToDatabase + _databaseName)) {
        SqlCeEngine engine;
        engine = new SqlCeEngine("Data Source = " + _pathToDatabase + _databaseName);
        engine.CreateDatabase();
        engine = null;
        CreateTables();
    }
}
public void CreateTables(){
    if (conn == null) {GetConnected();conn.Open(); }
    try {
        string SQL = "CREATE TABLE Albums ( " +
            "DiscID int, " +
            "AlbumID int, " +
            "ArtistName nvarchar(254), " +
            "AlbumName nvarchar(254), " +
            "Genre nvarchar(45) )";

        SqlCeCommand createTable = conn.CreateCommand();
        createTable.CommandText = SQL;
        createTable.ExecuteNonQuery();

        SQL = "CREATE TABLE Discs ( " +
            "DiscID int, " +
            "DiscNumber int, " +
            "DiscName nvarchar(45), " +
            "HasLabel int )";

        createTable = conn.CreateCommand();
        createTable.CommandText = SQL;
        createTable.ExecuteNonQuery();

    } catch (System.Data.SqlServerCe.SqlCeException ex) {
        MessageBox.Show(ex.Message, "DB Error");
    }
}
private void GetConnected(){
    conn = new SqlCeConnection("Data Source = " + _pathToDatabase + _databaseName);
}

用于在启用WebService调用之前检查网络连接的代码的一部分

// This code is in the ConnectivityTest class
public bool IsWebAccessible() {
    HttpWebRequest hwrRequest;
    HttpWebResponse hwrResponse;

    string strUrl = @"http://www.microsoft.com/";
    bool bConnected = false;

    try{
        hwrRequest = (HttpWebRequest)WebRequest.Create(strUrl);
        hwrRequest.Timeout = 10;
        hwrResponse = (HttpWebResponse)hwrRequest.GetResponse();

        if(hwrResponse.StatusCode == HttpStatusCode.OK){
            bConnected = true;
        }
    }catch(WebException we){
        bConnected = false;
    }catch(Exception ex){
        bConnected = false;
    }finally{
        hwrRequest = null;
        hwrResponse = null;
    }

    return bConnected;
}

使DataGrid美观且自动调整大小的方法

// This code is in the Util class
public static void FormatDataGrid(DataGrid dg, DataSet ds) {
    Font f2 = new Font("Tahoma",7, System.Drawing.FontStyle.Regular);
    dg.Font = f2;
    if (ds != null) {
        if (dg.TableStyles.Count > 0)
            dg.TableStyles.Clear();
        float sumWidths = 0.0f;
        foreach (DataTable dt in ds.Tables) {
            DataGridTableStyle DGStyle = new DataGridTableStyle();
            DGStyle.MappingName = dt.TableName;
            DataGridTextBoxColumn textColumn;
            System.Collections.ArrayList cWidths;
            cWidths = new System.Collections.ArrayList();
            Graphics g = dg.CreateGraphics();
            Font f = dg.Font;
            SizeF sf;
            int y = 0;
            foreach (DataColumn dc in dt.Columns) {
                sf = g.MeasureString("W" + dc.Caption, f);
                //cWidths.Add(sf.Width);
                if (y == 0)
                    cWidths.Add(36);
                else
                    cWidths.Add(102);
                y++;
            }
            foreach (DataColumn dc in dt.Columns) {
                textColumn = new DataGridTextBoxColumn();
                textColumn.MappingName = dc.ColumnName;
                textColumn.HeaderText = "" + dc.Caption;
                textColumn.Width =
		Convert.ToInt32(Convert.ToSingle(cWidths[dc.Ordinal]));
                DGStyle.GridColumnStyles.Add(textColumn);
                sumWidths += textColumn.Width;
            }
            dg.TableStyles.Add(DGStyle);
        }
    }
}

许多异步WebService调用中的一个示例

// This code is in the tabMain_SelectedIndexChanged event of the frmMain class
PocketCatalogue.SyncService.MusicCatalogueSync wsSync =
		new PocketCatalogue.SyncService.MusicCatalogueSync();
AsyncCallback cbDisc = new AsyncCallback(ServiceCallback_DiscCount);
wsSync.BeginGetDiscCount(cbDisc, wsSync);

// This code is in the frmMain class
private void ServiceCallback_DiscCount(IAsyncResult ar) {
    try {
        PocketCatalogue.SyncService.MusicCatalogueSync wsSync =
		(PocketCatalogue.SyncService.MusicCatalogueSync)ar.AsyncState;
        this.lblDiscsServer.Text = wsSync.EndGetDiscCount(ar).ToString();
        bDiscCountReturned = true;
        if ((bDiscCountReturned) && (bAlbumCountReturned) && (bTrackCountReturned)) {
            this.cmdSync.Enabled = true;
            this.lblStatusMessage.Text = "";
            tmrProgress.Enabled = false;
        }
    } catch (Exception) {
        MessageBox.Show("Error terminating Web Service call", this.Text);
        tmrProgress.Enabled = false;
    }
}

关注点

这是我的第一个袖珍PC应用程序,我非常喜欢它,并且计划做更多。我从这个小项目中学习了很多东西,包括移动设备上的线程、SqlCE数据库技术和异步WebService访问。

历史

  • 版本1.0,2005年9月21日

即将推出

  • 版本1.1将包含创建对应服务器MySQL数据库所需的语句
  • 版本1.2将包含正在使用的WebService的代码
© . All rights reserved.