如何调用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.gifContractedBlock.gif
dot.gif {
InBlock.gif
public partial class Form1 : Form
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
public Form1()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifInitializeComponent();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
private void button1_Click(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifDataConnectionDialog dlg 
= new DataConnectionDialog();
InBlock.gif
InBlock.gifdlg.DataSources.Add(DataSource.SqlDataSource);
InBlock.gif
if (DataConnectionDialog.Show(dlg, this== DialogResult.OK)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.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.gifContractedBlock.gif
dot.gif {
InBlock.gif
return DataConnectionDialog.Show(dialog, null);
ExpandedBlockEnd.gif}

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

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

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

ExpandedSubBlockEnd.gif}

InBlock.gifApplication.ThreadException 
+= new ThreadExceptionEventHandler(dialog.HandleDialogException);
InBlock.gifdialog._showingDialog 
= true;
InBlock.gif
try
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifDialogResult result1;
InBlock.gif
if ((dialog.SelectedDataSource == null|| (dialog.SelectedDataProvider == null))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.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.gifContractedSubBlock.gif
dot.gif{
InBlock.gifdialog.Container.Add(dialog1);
ExpandedSubBlockEnd.gif}

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

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

InBlock.gif
goto Label_015B;
ExpandedSubBlockEnd.gif}

InBlock.gif
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if (dialog.Container != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.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.gifContractedSubBlock.gif
dot.gif{
InBlock.gifdialog.StartPosition 
= FormStartPosition.CenterScreen;
ExpandedSubBlockEnd.gif}

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

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

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

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

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

ExpandedSubBlockEnd.gif}

InBlock.gifresult2 
= result1;
ExpandedSubBlockEnd.gif}

InBlock.gif
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.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里了。
      你可以利用这个来做个小工具,辅助自己平时的日常配置工作。如果你要发布产品,你可以从中学习它的制做思路,来做自己的数据源选择对话框。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值