stand on the shoulders of giants

StatusManager Control App with file

(How to interact between app and configuration file?)

1. Configuration file

<?xml version="1.0" encoding="utf-8" ?>
<StatusTexts>
  <StatusText>I'm working</StatusText>
  <StatusText>I'm watching TV</StatusText>
  <StatusText>I'm having lunch</StatusText>
</StatusTexts>

2. App

StatusManager

3. Code

class StatusManager
    {
        //定义BindingList是为了和控件绑定
        public BindingList<string> statusTexts;

        public StatusManager()
        {
            var statusSettings = XElement.Load("status.xml").Elements("StatusText");
            statusTexts = new BindingList<string>(statusSettings.Select(item => item.Value).ToList());
            statusTexts.ListChanged += new ListChangedEventHandler(statusTexts_ListChanged);                           
        }
        
        // 当StatusTexts发生变化,保存到文件
        private void statusTexts_ListChanged(object sender, ListChangedEventArgs e)
        {
            XElement node = new XElement("StatusTexts",
                        statusTexts.Select(
                            item => new XElement(
                                    "StatusText", item)));
            node.Save("status.xml");
        }
    }

Form 代码

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
                     
        }

       Action m_OKAction;                          // Action类型委托,在点击OK按钮后激发
        BindingList<string> m_statusList;           // 再定义一个变量 是为了跟踪改变

        private void Form1_Load(object sender, EventArgs e)
       {
           StatusManager sm = new StatusManager();

           // 和变量绑定,因为是BindList,所以m_statusList变化,sm.statusTexts也变化,
            // 因此触发statusTexts_ListChanged,保存到文件
            m_statusList = sm.statusTexts;
            statusComBox.DataSource = m_statusList; // 和Combox绑定
            statusListBox.DataSource = m_statusList;   // 和ListView绑定                      
        }  

        private void ShowControls()
        {
            statusBox.Visible = okBtn.Visible = button3.Visible = true;            
        }       

        private void addBtn_Click(object sender, EventArgs e)
        {
            ShowControls();

            statusBox.Text = string.Empty;

            m_OKAction =
                () =>
                {
                    string status = statusBox.Text;
                    if (!string.IsNullOrEmpty(statusBox.Text))
                    {
                        m_statusList.Add(status);
                    }
                };
        }

        private void modifyBtn_Click(object sender, EventArgs e)
        {
            ShowControls();
            statusBox.Text = statusListBox.SelectedItem.ToString();

            m_OKAction =
                () =>
                {
                    string status = statusBox.Text;

                    if (!string.IsNullOrEmpty(statusBox.Text))
                    {
                        m_statusList[statusListBox.SelectedIndex] = status;
                    }
                };
        }

        private void removeBtn_Click(object sender, EventArgs e)
        {
            m_statusList.Remove(statusListBox.SelectedItem.ToString());
        }

        private void okBtn_Click(object sender, EventArgs e)
        {
            if (m_OKAction != null)
            {
                m_OKAction();
            }
        }        
    }
示例下载:/Files/DylanWind/StatusManager.zip
posted @ 2009-05-22 16:11  DylanWind  阅读(252)  评论(0编辑  收藏  举报