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

扩展DataSet Quick Watch

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2006年11月1日

4分钟阅读

viewsIcon

61262

downloadIcon

472

DataSet 快速查看器应用程序的扩展版本。

Image Missing

引言

我的编程团队自成立以来一直在使用原始的 DataSet 快速查看器(作者 mohammed barqawi)。多么棒的工具!由于我们每天都使用此插件,因此出现了一些增强功能。例如,查看已删除的行,应用过滤器,支持 DataSetDataRowDataViewDataTable。我们找到了 增强型 DataSet 快速查看器(作者 Matt Simner),但增强版不允许您应用数据视图行状态过滤器。例如,您无法使用增强型 DataSet 快速查看器查看已删除的行。我喜欢 Matt 的想法,并想知道为什么他的行状态过滤器不起作用。

注意:我意识到 Visual Studio 2005 包含 Visualizers,但我的团队将在几年内不会迁移到 Visual Studio 的未来版本。所以请不要发布关于 VS 2005 中 Visualizers 的任何内容,因为我知道它们存在但我没有使用 VS 2005。谢谢!

有什么新内容

  1. 您可以选择一个 DataSetDataTableDataViewDataRow
  2. 选择 DataTableDataViewDataRow 时,包含相关表的选项卡页面会在 DataTable 的选项卡显示时成为当前选项卡。
  3. 如果一个对象扩展了 DataSetDataRowDataViewDataTable,它将是可访问的(即,类型化的 DataSet)。
  4. 您可以应用多个 Data View 行状态过滤器。例如,您可以同时查看添加和删除的行。
  5. 安装后,会写入适当的注册表项,在 Visual Studio 插件管理器对话框中提供更友好的描述。
  6. 行的状态决定了行的颜色。例如,已删除的行显示为红色,新行显示为绿色,修改过的行显示为黄色。
  7. 移除了 XML 选项卡以减小内存占用。

快速安装指南

对于那些不关心代码细节只想安装的人,这里有一些安装说明。

  1. 下载源文件。
  2. 构建解决方案。
  3. 关闭所有 Visual Studio 实例。
  4. 卸载当前安装的 DataSet Quick watch 版本。(添加/删除程序)
  5. 运行 DataSetQuickWatchExtendedInstall.msi。此文件在执行解决方案生成时创建。它将在 DataSetQuickWatchSetup\Debug 文件夹中。
  6. 如果不存在,请创建一个 c:\Temp 文件夹。
对于想要更多细节的人,请继续阅读。

背景

在可视化调试的 DataSet 之前,必须将其写入某处。原始的 DataSet Quick Watch 将 DataSet 的内容写入 EnvDTE.Debugger 对象内部。增强版本使用 DataSetWriteXML() 方法。

WriteXML() 方法有七个重载。我们需要调用包含 DiffGram 的重载版本。DiffGram 包含原始行值和当前行值。通过包含原始值和当前值,我们可以查看同一行的修改值和当前值。我们需要的方法重载版本签名是 WriteXML(string,System.Data.XmlWriteMode)。挑战在于您无法从 EnvDTE.Debugger 对象调用适当的重载版本。当您尝试从 EnvDTE.Debugger 对象调用此方法版本时,会收到错误 *error: arguments do not match parameters for function 'this.dsMain.WriteXml'*。

我们如何调用适当的方法重载,允许我们查看 DataSet 中所有行状态?我的解决方案包括以下内容:

  1. 在一个强命名程序集中创建一个辅助类。将此程序集安装到 GAC。
  2. 在辅助类中创建一个调用 WriteXML(OUTPUT_FILE,System.Data.XmlWriteMode.DiffGram 方法的方法。
  3. 让 DataSet Quick Watch 加载辅助类。一旦辅助类加载,调用方法将包括 DiffGram 的突出显示的 DataSet 内容写入。

使用代码

辅助类 DataSetQuickWatchHelper 包含以下方法。此方法从插件的 Connect.Exec 方法调用。
public static void WriteDebuggedDataSet(object prDataSet)
{
    DataSet rDS = prDataSet as DataSet;

    if (rDS == null)
    {
        return;
    }
    rDS.WriteXml(XML_PATH,System.Data.XmlWriteMode.DiffGram);
    rDS.WriteXmlSchema(XML_SCHEMA_PATH);
}
DataSetQuickWatchHelper 类通过扩展 System.Configuration.Install.Installer 类安装到 GAC。扩展类 DataSetQuickWatchHelperInstaller 重载两个方法。
public override void Install(IDictionary stateSaver)
{
    base.Install (stateSaver);

    string sAssemblyPath = base.Context.Parameters["name"].ToString();
    System.EnterpriseServices.Internal.Publish rPublish = 
        new System.EnterpriseServices.Internal.Publish();
    rPublish.GacInstall(sAssemblyPath);
}

public override void Uninstall(IDictionary savedState)
{
    string sAssemblyPath = base.Context.Parameters["name"].ToString();
    System.EnterpriseServices.Internal.Publish rPublish = 
         new System.EnterpriseServices.Internal.Publish();
    rPublish.GacInstall(sAssemblyPath);
    
    base.Uninstall (savedState);
}
        

DataSetQuickWatchSetup 项目中,定义了一个自定义操作来调用这些方法。

Image Missing

此自定义操作的属性为:

Image Missing

DataSetQuickWatch 类在 Connect.Exec 方法中使用以下代码访问 DataSetQuickWatchHelper 类。如您所见,调用了 System.Activator.CreateInstance 方法。此方法从 GAC 加载 DataSetQuickWatch 辅助类。如果成功创建程序集,则调用 DataSetQuickWatch.WriteDebuggedDataSet 方法。

// Load this assembly into the system.  
// NOTE:  This assembly is installed in the GAC.
//
string sCreateClass = "System.Activator.CreateInstance(" + '"' + 
       HELPER_CLASS_ASSEMBLY + "," + HELPER_CLASS_VERSION + 
       "," + HELPER_CLASS_CULTURE + "," + HELPER_CLASS_KEY + 
       '"' + "," + '"' + HELPER_CLASS_NAMESPACE + 
       HELPER_CLASS_CLASS  + '"' + ")";

EnvDTE.Expression rWriteExpression = 
   rDebugger.GetExpression(sCreateClass,true,nGetExpressionTimeout);
if (rWriteExpression.Value.IndexOf("error:")>-1)
{
    MessageBox.Show("Error loading Assembly '" + 
                    Application.ExecutablePath + 
                    "'","Error Information",
                    MessageBoxButtons.OK,MessageBoxIcon.Error);
}

//
// Write the highlighted DataSet to XML including a Diffgram.
//
string sLoadLocalDataSet = HELPER_CLASS_NAMESPACE + "." + 
                           HELPER_CLASS_CLASS + "." + 
                           HELPER_CLASS_METHOD + "(" + 
                           sDataSetObjectPath + ")";
rWriteExpression = rDebugger.GetExpression(sLoadLocalDataSet,
                   true,nGetExpressionTimeout);

关注点

设置行过滤器时,如果字段类型是字符串,则需要将所需值放在引号中。例如,Name='Bill'。

我的公司使用 Infragistics 的网格组件。为了确保此插件在没有自定义网格组件的情况下正常工作,我创建了一个使用 .NET 1.1 自带的 DataGrid 类的版本。这是包含的版本。

我没有测试 .NET DataGrid 类如何显示相关表。例如,Infragistics 网格会在行旁边显示一个加号 (+) 来显示子行。子行也会显示相应的颜色。我不确定 .NET DataGrid 类如何处理相关行/表。欢迎修改以使其正确显示。

DataSet 的 XML 和 XSD 被写入 C:\Temp 文件夹。确保此文件夹存在或修改代码以将其放置在其他文件夹中。我偷懒了,没有检查文件夹是否已存在。我假设每个人都有一个 C:\Temp 文件夹。

历史

欢迎任何反馈。

© . All rights reserved.