SqlDataSource控件的ConnectionString属性的设计时编辑器(UITypeEditor)。

首先使用Reflector查看SqlDataSource的源码,我们能够看到ConnectionString属性的生命如下: 

[Editor("System.Web.UI.Design.WebControls.SqlDataSourceConnectionStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor)), WebCategory("Data"), WebSysDescription("SqlDataSource_ConnectionString"), DefaultValue("")]



public
virtual string ConnectionString

SqlDataSourceConnectionStringEditor就是ConnectionString的设计时编辑器,我们能够在System.Design.dll程序集中找到这个类。

通过Reflector我们能够找到它的声明:

public class SqlDataSourceConnectionStringEditor : ConnectionStringEditor
{
    // Methods
    public SqlDataSourceConnectionStringEditor();
    protected override string GetProviderName(object instance);
    protected override void SetProviderName(object instance, DesignerDataConnection connection);
}

 SqlDataSourceConnectionStringEditor继承ConnectionStringEditor类,只是重载了GetProviderName,SetProvidername两个方法。

我们再来看看ConnectionStringEditor的声明:

public class ConnectionStringEditor : UITypeEditor
{
    // Fields
    private ConnectionStringPicker _connectionStringPicker;

    // Methods
    public ConnectionStringEditor();
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value);
    private static DesignerDataConnection GetCurrentConnection(Control control, string propertyName, string connectionString, string expressionPrefix); public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context);
    protected virtual string GetProviderName(object instance);
    protected virtual void SetProviderName(object instance, DesignerDataConnection connection);
    }
}

我们重点看一下EditValue方法:

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
Control control = context.Instance as Control;
if (provider != null)
{
IDataEnvironment service = (IDataEnvironment) provider.GetService(typeof(IDataEnvironment));
if (service != null)
{
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
if ((edSvc != null) && (context.Instance != null))
{ if (this._connectionStringPicker == null)
{
this._connectionStringPicker = new ConnectionStringPicker();
}
string connectionString = (string) value;
ExpressionEditor expressionEditor = ExpressionEditor.GetExpressionEditor(typeof(ConnectionStringsExpressionBuilder), provider);
if (expressionEditor == null)
{
return value;
}
string expressionPrefix = expressionEditor.ExpressionPrefix;
DesignerDataConnection currentConnection = GetCurrentConnection(control, context.PropertyDescriptor.Name, connectionString, expressionPrefix);
this._connectionStringPicker.Start(edSvc, service.Connections, currentConnection);
edSvc.DropDownControl(this._connectionStringPicker);
if (this._connectionStringPicker.SelectedItem != null)
{
DesignerDataConnection connection = this._connectionStringPicker.SelectedConnection;
if (connection == null)
{
connection = service.BuildConnection(UIServiceHelper.GetDialogOwnerWindow(provider), null);
}
if (connection != null)
{
if (connection.IsConfigured)
{
((IExpressionsAccessor) control).Expressions.Add(new ExpressionBinding(context.PropertyDescriptor.Name, context.PropertyDescriptor.PropertyType, expressionPrefix, connection.Name));
this.SetProviderName(context.Instance, connection);
IComponentChangeService service2 = (IComponentChangeService) provider.GetService(typeof(IComponentChangeService));
if (service2 != null)
{
service2.OnComponentChanged(control, null, null, null);
}
}
else
{
value = connection.ConnectionString;
this.SetProviderName(context.Instance, connection);
}
}
}
this._connectionStringPicker.End();
}
return value;
}
}
string providerName = this.GetProviderName(context.Instance);
ConnectionStringEditorDialog form = new ConnectionStringEditorDialog(provider, providerName);
form.ConnectionString = (string) value;
if (UIServiceHelper.ShowDialog(provider, form) == DialogResult.OK)
{
value = form.ConnectionString;
}
return value;
}
红字部分是设计时创建连接串的重点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值