关于编辑功能还有一个问题,如何将主窗口中选择的要编辑的项传递给新窗口?笔者的解决办法是给EditForm类增加一个Index属性,在新窗体显示前将被选中的ListBox的编号赋值给它。由于这样一个功能设计使得RssFeedList只能被设置为单选(属性中的SelectionMode值为One),这也是默认的设置。在EditForm类中添加如下代码:
private int index;
public int Index
{
get
{
return index;
}
set
{
index = value;
rssFeedName.Text = Properties.Settings.Default.RssFeedNames[index];
rssFeedTextBox.Text = Properties.Settings.Default.RssFeedUris[index];
}
}
这也是通用的C#类的属性设置结构。由于使用了RssFeed类中的静态函数需要在文件开始时使用using命令引用ScreenSharp.Rss命名空间,保存并关闭EditForm.cs,回到OptionForm.cs,在“编辑”按钮中的相应代码中加入如下代码:
EditForm editForm = new EditForm();
if ( RssFeedList.SelectedIndex != -1 )
editForm.Index = RssFeedList.SelectedIndex;
else
editForm.Index = 0;
editForm.Show();
“删除”的功能比较简单,不用新建一个窗体,直接在响应函数中处理就可以了,代码如下:
private void del_Click(object sender, EventArgs e)
{
Properties.Settings.Default.RssFeedNames.RemoveAt(RssFeedList.SelectedIndex);
Properties.Settings.Default.RssFeedUris.RemoveAt(RssFeedList.SelectedIndex);
Properties.Settings.Default.Save();
}
OptionForm.cs构造函数也需要更改一下,代码应改为:
InitializeComponent();
// 从当前设置加载文本框
try
{
backgroundImageFolderTextBox.Text = Properties.Settings.Default.BackgroundImagePath;
StringCollection sc = Properties.Settings.Default.RssFeedUris;
if (sc.Count > 0)
{
foreach (string str in Properties.Settings.Default.RssFeedNames)
{
RssFeedList.Items.Add(str);
}
}
}
catch
{
MessageBox.Show("读入屏幕保护程序的设置时出现了问题。");
}
由于使用了StringCollection需要引用System.Collections.Specialized命名空间。
UpdateApply和ApplyChanges函数也需要改动成如下代码:
// 仅在上次按下“应用”按钮后
// 发生了更改的情况下将该按钮更新为活动状态
private void UpdateApply()
{
if (Properties.Settings.Default.BackgroundImagePath != backgroundImageFolderTextBox.Text)
applyButton.Enabled = true;
else
applyButton.Enabled = false;
}
// 应用自上次按下“应用”按钮后发生的所有更改
private void ApplyChanges()
{
Properties.Settings.Default.BackgroundImagePath = backgroundImageFolderTextBox.Text;
Properties.Settings.Default.Save();
}
|