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

TaskListManager

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.24/5 (9投票s)

2008 年 3 月 13 日

CPOL

2分钟阅读

viewsIcon

51782

downloadIcon

1216

在繁琐的日常日程中,只有像这样的工具才能帮助我们稍微整理一下。

引言

TaskManager 是一个个人信息管理器 (PIM)。它是一个用于管理各种个人信息的工具,例如任务、事件、联系人、收藏夹和网络链接,这些信息可以在同一个表单上浏览。它可以作为思维刺激器,以及自我分析和自我改进工具。

在 TaskManager 中,没有使用数据库;所有相关信息都存储在 XML 文件中。它可以是两个 XML 文件互操作性的最佳示例之一。

我们无需安装数据库即可使用此应用程序。

Task_1.JPG

主要有三个部分

任务管理: 提醒未完成的任务。添加、删除、编辑和将任务列表导出为 HTML 或 Excel 文件。要添加或编辑任务列表,我们需要单击左侧窗格中的“任务”按钮。

Task_2.JPG

所有未完成的任务将以工具提示的形式显示在托盘图标中。单击工具提示时,用户可以显示主表单。

联系人管理: 以树状视图查看联系人,易于导航,添加和删除联系人。为所有联系人创建组。

Contacts.JPG

互联网收藏夹: 从 Internet Explorer 收藏夹列表中获取所有文件夹和链接,并将其显示为树状视图。导航到收藏夹节点并在同一表单的网页浏览器中显示页面。安装应用程序后,它将在运行时获取收藏夹。

Fav.JPG

使用代码

我尝试使其自解释且分层。主要的类是:TreeViewSerializer.csContactForm.csTaskManagerForm.cs

以下方法将负责在 TaskList XML 文件的任务表中添加任务。

/// <summary>
/// Utility method to update the visual representation of
/// the tasks (the CheckedListBox) with a new or updated row.
/// </summary>
/// <param name="rowIndex">Index of modifed row, or -1 for new row</param>
/// <param name="row">Row object from the DataTable</param>
private void UpdateDisplayWithRow(int rowIndex, TasksDataSet.TasksRow row)
{
    string title, format = "{0} - Due: {1:d}";

    title = string.Format(format, row.TaskTitle, row.TaskDueDate);

    if (rowIndex == -1)
    {
        tasksCheckedListBox.Items.Add(title, row.TaskComplete);
    }
    else
    {
        // Remove the old value, add a new one, set the checkbox
        tasksCheckedListBox.Items.RemoveAt(rowIndex);
        tasksCheckedListBox.Items.Insert(rowIndex, title);
        tasksCheckedListBox.SetItemChecked(rowIndex, row.TaskComplete);
    }
}

/// <summary>
/// Loads the entries using XML deserialization
/// </summary>
public void LoadEntries()
{
    try
    {
        XmlSerializer s = new XmlSerializer(typeof(TasksDataSet));
        TextReader r = new StreamReader("TaskList.xml");
        ds = (TasksDataSet)s.Deserialize(r);
        r.Close();

    }
    catch
    {
        ds = new TasksDataSet();
    }

    foreach (TasksDataSet.TasksRow row in ds.Tasks)
    {
        UpdateDisplayWithRow(-1, row);
    }
}

/// <summary>
/// Saves the entries using XML serialization
/// </summary>
public void SaveEntries()
{
    try
    {
        XmlSerializer s = new XmlSerializer(typeof(TasksDataSet));
        TextWriter w = new StreamWriter("TaskList.xml");
        s.Serialize(w, ds);
        w.Close();
    }
    catch( Exception x )
    {
        appNotifyIcon.ShowBalloonTip(8000,
            "Bh@nu's - Task Manager",
            "Tasks could not be saved.\n" + x.Message, ToolTipIcon.Error);
    }
}

CheckTaskDates() 方法将检查任务列表中的任务到期情况。所有未完成的任务将每分钟以工具提示的形式显示在托盘图标上。

/// <summary>
/// Scans the list of tasks. Any incomplete tasks due
/// yesterday or earlier are appended to a buffer for
/// display in the tooltip.
/// </summary>
private void CheckTaskDates()
{
    // StringBuilder is more efficient than string concatentation
    StringBuilder buffer = new StringBuilder();

    // Iterate over each task in the DataSet
    foreach (TasksDataSet.TasksRow row in ds.Tasks)
    {
        // Compare date and completed flag
        if ((DateTime.Now.Date > row.TaskDueDate) && !row.TaskComplete)
        {
            buffer.Append(row.TaskTitle).Append(", Due: ");
            buffer.AppendFormat("{0:d}", row.TaskDueDate).Append('\n');
        }
    }

    // If the buffer is not empty, there is at least one
    // task to display
    if (buffer.Length > 0)
    {
        // Display an Info balloon tip for 8 seconds
        appNotifyIcon.ShowBalloonTip(8000, 
            "bh@nu's - Task Manager", 
            buffer.ToString(), ToolTipIcon.Info);
    }
}

ContactForm 类中还有另一个重要的方法。此方法将负责将新联系人添加到两个 XML 文件中,以及其唯一的组和 ID。一个 XML 文件将包含树状视图数据,另一个 XML 文件将包含详细信息。我创建这两个 XML 文件是为了方便显示树状视图。

private void btnUpdate_Click(object sender, System.EventArgs e)
{
    TreeViewSerialization.TreeViewSerializer objTreeViewSerializer = 
                    new TreeViewSerialization.TreeViewSerializer();
    //objTreeViewSerializer.SerializeTreeView(this.treeView_Contacts,
    //       Application.StartupPath + "\\..\\..\\bhanu.xml");
    objTreeViewSerializer.SerializeTreeView(this.treeView_Contacts, 
                          Application.StartupPath + "\\bhanu.xml");

    bool bAddNew = (m_iContactID == 0) ? true : false;

    bool bContinue = true;

    try
    {
        string sFullName = txt_Name.Text;
        string sCellPhone = txt_Cell.Text;
        string sHomePhone = txt_Home.Text;
        string sEmail = txt_Email.Text;
        string sEmail2 = txt_Email2.Text;
        string sAddress = txt_Address.Text;
        string sCity = txt_City.Text;
        string sState = cmb_State.Text;
        string sZip = txt_Zip.Text;
        string sBDay = dt_DateTimePicker.Value.ToLongDateString();

        if( sFullName == "" || sCellPhone == "" || 
            sHomePhone == "" || sEmail == "" || 
            sEmail2 == "" || sAddress == "" || 
            sCity == "" || sState == "" ||
            sZip == "" || sBDay == "" )
        {
            MessageBox.Show( "You must have valid data in each field before" + 
                             " you may\nadd this contact to your contact's list.", 
                             "Validation Error...", MessageBoxButtons.OK, 
                             MessageBoxIcon.Exclamation );
            bContinue = false;
        }

        if( bContinue )
        {
            if( bAddNew == true )
            {
                AddContact( m_XmlDocument, m_iNextID, sFullName, 
                    sCellPhone, sHomePhone, sEmail, sEmail2, sAddress,
                    sCity, sState, sZip, sBDay );
          
                AddContactToCombo( m_iNextID, sFullName );
          
                m_iNextID++;
            }
            else
            {
                UpdateContact( m_XmlDocument, m_iNextID, sFullName, 
                    sCellPhone, sHomePhone, sEmail, sEmail2, sAddress,
                    sCity, sState, sZip, sBDay );
            }
    
            m_XmlDocument.Save( m_sXmlFileName );
        }
    }
    catch( Exception exception )
    {
        MessageBox.Show( exception.Message );
    }
}

private void treeView_Contacts_AfterSelect(object sender, TreeViewEventArgs e)
{
    AddNewContact();
    if (treeView_Contacts.SelectedNode.Text == "Friends" || 
        treeView_Contacts.SelectedNode.Text == "Work")
    {
        return;
    }
    else
    {
        this.txt_Name.Text = this.treeView_Contacts.SelectedNode.Text;

        string strEmail = string.Empty;
        XmlDocument xmlContacts = new XmlDocument();

        xmlContacts.Load(Application.StartupPath +"\\My_Contacts.xml");
                
        foreach (XmlNode xmlItem in xmlContacts)
        {
            foreach (XmlNode newnode in xmlItem)
            {
                if (newnode["FullName"].InnerText == 
                    this.treeView_Contacts.SelectedNode.Text)
                {
                    this.txt_Email.Text = newnode["Email"].InnerText;
                    this.txt_City.Text = newnode["City"].InnerText;
                    this.txt_Home.Text = newnode["HomePhone"].InnerText;
                    this.txt_Zip.Text = newnode["ZipCode"].InnerText;
                    this.txt_Email2.Text = newnode["Email2"].InnerText;
                    this.txt_Address.Text = newnode["StreetAddress"].InnerText;
                    this.cmb_State.Text = newnode["State"].InnerText;
                    this.dt_DateTimePicker.Text = newnode["BDay"].InnerText;
                    this.txt_Cell.Text = newnode["CellPhone"].InnerText;

                }
            }
        }
    }
}

显示 Internet 收藏夹非常简单,只有几个方法用于显示所有内容。我按原样编写这些方法。

private bool LoadWebSitesTree()
{
    bool result = false;
    try
    {
        Cursor = Cursors.WaitCursor;
        string favFolderPath = 
          Environment.GetFolderPath(Environment.SpecialFolder.Favorites);

        // Disables any redrawing of the tree view till we are done
        tvWebSites.BeginUpdate();

        LoadFavFromFolder(new DirectoryInfo(favFolderPath), webSitesRootNode);
        LoadFavFromPath(favFolderPath, webSitesRootNode);

        result = true;
    }
    catch (Exception exp) 
    {
        //DebugLog.Instance.REPORT(exp); 
    }
    finally
    {
        Cursor = Cursors.Default;
        tvWebSites.EndUpdate();
    }

    return result;
}

private void LoadFavFromFolder(DirectoryInfo curDirInfo, TreeNode curNode)
{
    try
    {
        TreeNode newNode;

        foreach (DirectoryInfo dirInfo in curDirInfo.GetDirectories())
        {
            if (curNode == null)
                newNode = tvWebSites.Nodes.Add(dirInfo.Name);
            else
                newNode = curNode.Nodes.Add(dirInfo.Name);

            if (dirInfo.GetDirectories().Length == 0)
                LoadFavFromPath(dirInfo.FullName, newNode);
            else
                LoadFavFromFolder(dirInfo, newNode);
        }
    }
    catch (Exception exp) 
    { 
        //DebugLog.Instance.REPORT(exp); 
    }
}

private void LoadFavFromPath(string curPath, TreeNode curNode)
{
    try
    {
        DirectoryInfo curDirInfo = new DirectoryInfo(curPath);

        foreach (FileInfo objFile in curDirInfo.GetFiles("*.url"))
        {
            TreeNode newNode = new TreeNode();

            string fileName = objFile.FullName;
            newNode.Tag = GetURLValue(fileName);
            newNode.Text = Path.GetFileNameWithoutExtension(fileName);
            newNode.ImageIndex = 2;
            newNode.SelectedImageIndex = 2;

            if (curNode == null)
                tvWebSites.Nodes.Add(newNode);
            else
                curNode.Nodes.Add(newNode);
        }
    }
    catch (Exception exp) 
    { 
        //DebugLog.Instance.REPORT(exp); 
    }
}

//    Reading favorites file as INI file getting the value of URL=
private string GetURLValue(string fileName)
{
    string strURL = null;
    StreamReader reader = null;
    try
    {
        reader = new StreamReader(fileName);
        string fileLine;
        int iIndex = -1;
        while ((fileLine = reader.ReadLine()) != null)
        {
            if (fileLine != null)
            {
                if ((iIndex = fileLine.IndexOf("URL=")) >= 0)
                {
                    strURL = fileLine.Substring(iIndex + 4);
                    break;
                }
            }
        }
    }
    catch (Exception exp) 
    { 
        //DebugLog.Instance.REPORT(exp); 
    }
    finally
    {
        try { if (reader != null) reader.Close(); }
        catch (Exception exp) 
        { 
            //DebugLog.Instance.REPORT(exp);
        }
    }

    return strURL;
}

待办事项

  1. 任务网格中的打印支持。
  2. 身份验证后的用户名和密码收集。
  3. 文本装饰。

干杯!!!

© . All rights reserved.