注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 企鹅咬死珊瑚虫,窗口夹烂..
 帮助

用程序来列举项目资源


2006-09-08 14:35:07
 标签:程序 项目资源   [推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
为了让全项目的资源能够有效的被运用,不可能不了解建立与存取项目资源的方法。除了使用资源编辑器之外,我们也可以在应用程序中透过程序代码来存取项目资源,虽然使用Resources对象能够非常容易去存取特定的项目资源,但是如果我们希望在应用程序中透过程序代码来列举项目资源的话,该怎么做呢?
 
要想透过程序代码来枚举项目资源,必须使用System.Resources命名空间中的ResourceReader类。一般的作法是,先使用指定的项目资源文件来创建一个ResourceReader对象,接着调用ResourceReader对象的GetEnumerator方法来取得其枚举操作符,然后再通过一个循环去调用列举子的MoveNext方法即可取得各个项目资源。
                     1-1
                           1-2 资源阅读器
                    1-3资源阅读器
                    1-4资源阅读器
                           1-5资源阅读器
程序范例:
程序范例DemoForm001.cs示范如何创建一个资源阅读器来让您产看项目文件中的所有资源。首先,您必须如图1-所示去打开一个资源文件(.resources),接下来会将该资源文件中的所有资源列示于DataGridView控件中,每一项资源的名称、类型、与值都一览无遗。您可以如图1-2~1-5所示,从中选取所要阅读的资源,该项资源的资源名称、资源类型、资源值、以及字节会完整列示于画面的右侧。
程序范例DemoForm001.cs的设计技巧重点说明如下:
  我们会创建一个名称为Resource的结构来持有每一个资源的名称、类型、值、以及字节:
public struct Resource
{
 private object ValueData;
 private string TypeValue;
 private string NameValue;
 private byte[] BytesValue;
 
 public object Value
 {
  get
  {
   return ValueData;
  }
 }
 ...
 public Resource(
   string Name, string type, object value, byte[] bytes)
 {
  NameValue = Name;
  TypeValue = type;
  ValueData = value;
  BytesValue = bytes;
 }
}
     如下所示,声明一个类级别的泛型集合类Dictionary类型的变量:
private Dictionary<string, Resource> resources;
     第一个类型参数string代表资源的名称,第二个类型参数Resource代表含有每一个资源相关信息的Resource结构。
 
     替菜单项目打开资源文件Click事件处理函数撰写下列程序代码,以便根据用户所选取的资源文件来创建一个ResourceReader对象,接着调用ResourceReader对象的GetEnumerator方法来取得其枚举操作符,然后再通过一个循环去调用枚举操作符的MoveNext方法即可取得各个项目资源。我们会在循环中调用GetResourceData方法来取得资源的类型与二进制信息,然后将我们所读取的每一个资源新增至resource这一个Dictionary对象中,以便稍后能够访问它:
private void openToolStripMenuItem_Click(
  object sender, EventArgs e)
{
 ...
 // 创建一个 Dictionary 对象。
 resources = new Dictionary<string, Resource>();
 ...
 try
 {
  // 根据用户所选取的资源文件来创建
  // 一个 ResourceReader 对象。
  using(ResourceReader myReader =
    new ResourceReader(myFileName))
  {
   // 取得 ResourceReader 对象的枚举操作符
   // 以便循览项目资源。
   IDictionaryEnumerator ReaderWalker =
     myReader.GetEnumerator();
  
   // 读取资源。
   while(ReaderWalker.MoveNext())
   {
    // 枚举操作符的索引键就是资源名称。
    ResourceName = ReaderWalker.Key.ToString();
        
    // GetResourceData 被用来取得资源的
    // 类型与二进制信息。
    myReader.GetResourceData(
      ResourceName, out ResourceType,
      out ResourceBytes);
        
    // 如果可以的话,我们将直接读取资源的值。
    try
    {
     ResourceValue = ReaderWalker.Value;
    }
    catch(FileNotFoundException)
    {
     ResourceValue = "无法解析的类型:" + ResourceType;
    }
    catch(TypeLoadException)
    {
     ResourceValue = "无法解析的类型:" + ResourceType;
    }
    ...
    // 将我们所读取的每一个资源新增
    // resources 这一个 Dictionary 对象中,
    // 以便稍后能够访问它。
    resources.Add(ResourceName,
      new Resource(ResourceName, ResourceType,
      ResourceValue, ResourceBytes));
    ...
    // 将信息新增至 DataGridView 中。
    gridResources.Rows.Add(
      new object[]{ResourceName, ShortType(
      ResourceType), shortVal});
   }
  }
 }
 ...
}
当用户于DataGridView控件中选取某一个资源时,就会将该资源的名称、型别、值、以及字节显示在右侧的各个控件中。

本文出自 “章立民” 博客,转载请与作者联系!





    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: