首先使用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("")] |
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;
}
红字部分是设计时创建连接串的重点。