如何调用VS自带的数据源选择对话框

简介:
 在实际的开发中,为了方便软件的部署我们常常需要让客户手动的选择数据源和数据连接信息。当然我们可以将这些信息写在XML的配置文件里.但是客户并不是专业的编程人员,一不小心就会使连接串写错,导致系统无法运行,最好是让用户能够通过一个图形界面来选择,如下图:

      这样子,既方便,有不容易出问题。下来我们就看看怎么实现。我的思路就是调用VS自带的工具,由于没有相关的文档,只有通过反汇编了。先添加对Microsoft.Data.ConnectionUI.Dialog.dll的引用,这个assmbly在你的VS2005的安装目录下具体是在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE下边,我的VS安装在D盘,大家可以根据情况去找,调用很简单,下面是代码:
      
None.gif using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.ComponentModel;
None.gif
using  System.Data;
None.gif
using  System.Drawing;
None.gif
using  System.Text;
None.gif
using  System.Windows.Forms;
None.gif
using  Microsoft.Data.ConnectionUI;
None.gif
None.gif
namespace  testConnectionStringUI
ExpandedBlockStart.gif
{
InBlock.gif
public partial class Form1 : Form
ExpandedSubBlockStart.gif
{
InBlock.gif
public Form1()
ExpandedSubBlockStart.gif
{
InBlock.gifInitializeComponent();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
private void button1_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gif
{
InBlock.gifDataConnectionDialog dlg 
= new DataConnectionDialog();
InBlock.gif
InBlock.gifdlg.DataSources.Add(DataSource.SqlDataSource);
InBlock.gif
if (DataConnectionDialog.Show(dlg, this== DialogResult.OK)
ExpandedSubBlockStart.gif
{
InBlock.giftextBox1.Text 
= dlg.ConnectionString;
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif

      解释一下这段很简单的代码,我创建了一个WindowsApplication,其中有一个窗体,在窗体上放置了一个TextBox和一个Button 控件 ,在Button的点击事件里添加数据源选择对话框的调用。DataConnectionDialog 的调用比较有意思,虽然DataConnectionDialog提供了Show和ShowDialog实例方法,但是你却不能调用,你只能调用Show静态方法,Show方法有两个重载版本:
None.gif public   static  DialogResult Show(DataConnectionDialog dialog);
None.gif
public   static  DialogResult Show(DataConnectionDialog dialog, IWin32Window owner);
None.gif
public   static  DialogResult Show(DataConnectionDialog dialog)
ExpandedBlockStart.gif
{
InBlock.gif
return DataConnectionDialog.Show(dialog, null);
ExpandedBlockEnd.gif}

None.gif
下边是第二个方法的实现:
None.gif public   static  DialogResult Show(DataConnectionDialog dialog, IWin32Window owner)
ExpandedBlockStart.gif
{
InBlock.gifDialogResult result2;
InBlock.gif
if (dialog == null)
ExpandedSubBlockStart.gif
{
InBlock.gif
throw new ArgumentNullException("dialog");
ExpandedSubBlockEnd.gif}

InBlock.gif
if (dialog.DataSources.Count == 0)
ExpandedSubBlockStart.gif
{
InBlock.gif
throw new InvalidOperationException(SR.GetString("DataConnectionDialog_NoDataSourcesAvailable"));
ExpandedSubBlockEnd.gif}

InBlock.gif
foreach (DataSource source1 in dialog.DataSources)
ExpandedSubBlockStart.gif
{
InBlock.gif
if (source1.Providers.Count == 0)
ExpandedSubBlockStart.gif
{
ExpandedSubBlockStart.gif
throw new InvalidOperationException(SR.GetString("DataConnectionDialog_NoDataProvidersForDataSource"new object[] { source1.DisplayName.Replace("'""''") }));
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifApplication.ThreadException 
+= new ThreadExceptionEventHandler(dialog.HandleDialogException);
InBlock.gifdialog._showingDialog 
= true;
InBlock.gif
try
ExpandedSubBlockStart.gif
{
InBlock.gifDialogResult result1;
InBlock.gif
if ((dialog.SelectedDataSource == null|| (dialog.SelectedDataProvider == null))
ExpandedSubBlockStart.gif
{
InBlock.gifDataConnectionSourceDialog dialog1 
= new DataConnectionSourceDialog(dialog);
InBlock.gifdialog1.Title 
= dialog.ChooseDataSourceTitle;
InBlock.gifdialog1.HeaderLabel 
= dialog.ChooseDataSourceHeaderLabel;
InBlock.gif(dialog1.AcceptButton 
as Button).Text = dialog.ChooseDataSourceAcceptText;
InBlock.gif
if (dialog.Container != null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog.Container.Add(dialog1);
ExpandedSubBlockEnd.gif}

InBlock.gif
try
ExpandedSubBlockStart.gif
{
InBlock.gif
if (owner == null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog1.StartPosition 
= FormStartPosition.CenterScreen;
ExpandedSubBlockEnd.gif}

InBlock.gifdialog1.ShowDialog(owner);
InBlock.gif
if ((dialog.SelectedDataSource == null|| (dialog.SelectedDataProvider == null))
ExpandedSubBlockStart.gif
{
InBlock.gif
return DialogResult.Cancel;
ExpandedSubBlockEnd.gif}

InBlock.gif
goto Label_015B;
ExpandedSubBlockEnd.gif}

InBlock.gif
finally
ExpandedSubBlockStart.gif
{
InBlock.gif
if (dialog.Container != null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog.Container.Remove(dialog1);
ExpandedSubBlockEnd.gif}

InBlock.gifdialog1.Dispose();
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifdialog._saveSelection 
= false;
InBlock.gifLabel_015B:
InBlock.gif
if (owner == null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog.StartPosition 
= FormStartPosition.CenterScreen;
ExpandedSubBlockEnd.gif}

InBlock.gifLabel_0165:
InBlock.gifresult1 
= dialog.ShowDialog(owner);
InBlock.gif
if (result1 == DialogResult.Ignore)
ExpandedSubBlockStart.gif
{
InBlock.gifDataConnectionSourceDialog dialog2 
= new DataConnectionSourceDialog(dialog);
InBlock.gifdialog2.Title 
= dialog.ChangeDataSourceTitle;
InBlock.gifdialog2.HeaderLabel 
= dialog.ChangeDataSourceHeaderLabel;
InBlock.gif
if (dialog.Container != null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog.Container.Add(dialog2);
ExpandedSubBlockEnd.gif}

InBlock.gif
try
ExpandedSubBlockStart.gif
{
InBlock.gif
if (owner == null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog2.StartPosition 
= FormStartPosition.CenterScreen;
ExpandedSubBlockEnd.gif}

InBlock.gifresult1 
= dialog2.ShowDialog(owner);
InBlock.gif
goto Label_0165;
ExpandedSubBlockEnd.gif}

InBlock.gif
finally
ExpandedSubBlockStart.gif
{
InBlock.gif
if (dialog.Container != null)
ExpandedSubBlockStart.gif
{
InBlock.gifdialog.Container.Remove(dialog2);
ExpandedSubBlockEnd.gif}

InBlock.gifdialog2.Dispose();
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifresult2 
= result1;
ExpandedSubBlockEnd.gif}

InBlock.gif
finally
ExpandedSubBlockStart.gif
{
InBlock.gifdialog._showingDialog 
= false;
InBlock.gifApplication.ThreadException 
-= new ThreadExceptionEventHandler(dialog.HandleDialogException);
ExpandedSubBlockEnd.gif}

InBlock.gif
return result2;
ExpandedBlockEnd.gif}

None.gif

      在我编写的代码里面只提供了sql server的数据源,你还可以使用别的数据源或者同时使用多个数据源,如果你不会使用反汇编的话,我可以把其余的数据源列出来以供你使用:OdbcDataSource,OracleDataSource,SqlFileDataSource,AccessDataSource,SqlDataSource
运行程序,点击按钮,选择数据,选择相应的provider,填写数据源的相关信息,然后点击OK,现在数据源连接串出现在了TextBox里了。
      你可以利用这个来做个小工具,辅助自己平时的日常配置工作。如果你要发布产品,你可以从中学习它的制做思路,来做自己的数据源选择对话框。





本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/03/580236.html,如需转载请自行联系原作者
目录
相关文章
|
3月前
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
28 5
|
4月前
|
DataWorks 关系型数据库 MySQL
DataWorks数据源暂未绑定数据源,绑定时却显示已经有 1 个是什么回事?
DataWorks数据源暂未绑定数据源,绑定时却显示已经有 1 个是什么回事?
32 2
|
9月前
|
C#
创建窗体及一系列操作
创建窗体及一系列操作
|
SQL BI
FineReport 下拉列表框作为动态参数的实现方式(不使用参数界面实现参数对数据过滤)
决策报表中,不使用参数界面实现参数对图表的绑定(如:下拉列表框值对条状图数据过滤) 实现方法:下拉列表框的`控件名`是参数名
284 0
FineReport 下拉列表框作为动态参数的实现方式(不使用参数界面实现参数对数据过滤)
|
API C# 图形学
编辑器扩展——自定义窗口
Unity 允许用户实现自定义窗口,以实现项目更加灵活且系统的配置。例如关卡编辑器、打包编辑器等等。它是能做出最多自定义功能的,但是实现过程其实也是比较固定的。总得来说自定义窗口最重要的部分其实是窗口内GUI得布局和方法,也就是说你要在窗口里做些什么。
1033 0
|
Oracle 关系型数据库 MySQL
Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换
有时候需要在程序中动态切换数据源,那么这个系列的之前的博文所阐述的方法就不再使用了,总不能通过程序更改config.properties文件的dataSource的值,然后再重启web服务器以便加载applicationContext.xml文件。
1547 0