扩展DataSet Quick Watch





3.00/5 (2投票s)
2006年11月1日
4分钟阅读

61262

472
DataSet 快速查看器应用程序的扩展版本。
引言
我的编程团队自成立以来一直在使用原始的 DataSet 快速查看器(作者 mohammed barqawi)。多么棒的工具!由于我们每天都使用此插件,因此出现了一些增强功能。例如,查看已删除的行,应用过滤器,支持 DataSet
、DataRow
、DataView
和 DataTable
。我们找到了 增强型 DataSet 快速查看器(作者 Matt Simner),但增强版不允许您应用数据视图行状态过滤器。例如,您无法使用增强型 DataSet
快速查看器查看已删除的行。我喜欢 Matt 的想法,并想知道为什么他的行状态过滤器不起作用。
注意:我意识到 Visual Studio 2005 包含 Visualizers,但我的团队将在几年内不会迁移到 Visual Studio 的未来版本。所以请不要发布关于 VS 2005 中 Visualizers 的任何内容,因为我知道它们存在但我没有使用 VS 2005。谢谢!
有什么新内容
- 您可以选择一个
DataSet
、DataTable
、DataView
或DataRow
。 - 选择
DataTable
、DataView
或DataRow
时,包含相关表的选项卡页面会在DataTable
的选项卡显示时成为当前选项卡。 - 如果一个对象扩展了
DataSet
、DataRow
、DataView
或DataTable
,它将是可访问的(即,类型化的DataSet
)。 - 您可以应用多个 Data View 行状态过滤器。例如,您可以同时查看添加和删除的行。
- 安装后,会写入适当的注册表项,在 Visual Studio 插件管理器对话框中提供更友好的描述。
- 行的状态决定了行的颜色。例如,已删除的行显示为红色,新行显示为绿色,修改过的行显示为黄色。
- 移除了 XML 选项卡以减小内存占用。
快速安装指南
对于那些不关心代码细节只想安装的人,这里有一些安装说明。
- 下载源文件。
- 构建解决方案。
- 关闭所有 Visual Studio 实例。
- 卸载当前安装的 DataSet Quick watch 版本。(添加/删除程序)
- 运行 DataSetQuickWatchExtendedInstall.msi。此文件在执行解决方案生成时创建。它将在 DataSetQuickWatchSetup\Debug 文件夹中。
- 如果不存在,请创建一个 c:\Temp 文件夹。
背景
在可视化调试的 DataSet
之前,必须将其写入某处。原始的 DataSet Quick Watch 将 DataSet
的内容写入 EnvDTE.Debugger
对象内部。增强版本使用 DataSet
的 WriteXML()
方法。
WriteXML()
方法有七个重载。我们需要调用包含 DiffGram 的重载版本。DiffGram 包含原始行值和当前行值。通过包含原始值和当前值,我们可以查看同一行的修改值和当前值。我们需要的方法重载版本签名是 WriteXML(string,System.Data.XmlWriteMode)
。挑战在于您无法从 EnvDTE.Debugger
对象调用适当的重载版本。当您尝试从 EnvDTE.Debugger
对象调用此方法版本时,会收到错误 *error: arguments do not match parameters for function 'this.dsMain.WriteXml'*。
我们如何调用适当的方法重载,允许我们查看 DataSet
中所有行状态?我的解决方案包括以下内容:
- 在一个强命名程序集中创建一个辅助类。将此程序集安装到 GAC。
- 在辅助类中创建一个调用
WriteXML(OUTPUT_FILE,System.Data.XmlWriteMode.DiffGram
方法的方法。 - 让 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 项目中,定义了一个自定义操作来调用这些方法。
此自定义操作的属性为:
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 文件夹。
历史
欢迎任何反馈。