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






3.33/5 (3投票s)
搜索 MP3 音乐目录的 Windows Mobile 应用程序。

引言
这个应用程序本质上是一个搜索工具,用于查找我想听的音乐专辑位于哪个光盘编号上。该应用程序还包含从中央数据库服务器(通过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
的代码