PropertyGrid ConnectionString Editor
Frank Dzaebel, erstellt am: 13.5.2009, zuletzt geändert:
15.5.2009
Kategorie: PropertyGrid, .NET-Version: 2.0,
3.5, [Download]
Das PropertyGrid in Windows Forms ist sehr flexibel, aber aus Rechte-Gründen ist die Eingabe eines ConnectionString in Einstellungen normal
nicht möglich (im Application Scope). Hier wird ein Weg über die typsicheren Settings
gezeigt, in denen ein Windows-ConnectionString-Editor eingeblendet wird, wenn im
PropertyGrid der Button zum Editieren der DB-Verbindungszeichenkette geklickt wird.
Properties.Settings Props = Properties.Settings.Default;
private void Form1_Load(object sender, EventArgs e)
{
if (Props.Einstellungen == null) { Props.Einstellungen = new Einstellungen(); Props.Save();}
propertyGrid1.SelectedObject = Props.Einstellungen;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Props.Save();
}
public class Einstellungen
{
/// <summary>Standard-ConnectionString der Datenbank</summary>
const string standardConnectionString =
//"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False"; // Beispiel: Access
"Provider=SQLNCLI.1;Integrated Security=SSPI;" +
"Persist Security Info=False;Data Source=."; // Beispiel SQL-Server
public Einstellungen()
{
DB_Verbindungszeichenfolge = standardConnectionString;
}
/// <summary>ConnectionString der Datenbank</summary>
[DebuggerNonUserCode()]
[Editor(typeof(ConnectionStringUITypeEditor), typeof(UITypeEditor))]
[DefaultSettingValue(standardConnectionString)]
[Description("ConnectionString der Datenbank")]
public string DB_Verbindungszeichenfolge { get; set; }
}
/// <summary> Ein Type Editor für DB Verbindungen. [Frank Dzaebel] </summary>
public class ConnectionStringUITypeEditor : UITypeEditor
{
public ConnectionStringUITypeEditor() { }
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
return this.EditValue(value as string);
}
public string EditValue()
{
return this.EditValue(string.Empty);
}
public string EditValue(string value)
{
string newValue = string.Empty;
ConnectionString connectionString =
new ConnectionString();
return connectionString.ShowDialog(value);
}
}
public class ConnectionString
{
public ConnectionString() { }
public string ShowDialog()
{
return ShowDialog(null);
}
public string ShowDialog(string connectionString)
{
string retVal = string.Empty;
try
{
Type adoType = Type.GetTypeFromProgID("ADODB.Connection");
Type msdascType = Type.GetTypeFromProgID("DataLinks");
object adoConn = null;
object msdascLink = Activator.CreateInstance(msdascType);
if ((connectionString == null) || (connectionString.Length == 0))
{
object connectionObject = msdascType.InvokeMember(
"PromptNew", BindingFlags.Instance | BindingFlags.InvokeMethod,
null, msdascLink, null);
adoConn = connectionObject;
retVal = TypeDescriptor.GetProperties(adoConn)
["ConnectionString"].GetValue(adoConn) as string;
}
else
{
adoConn = Activator.CreateInstance(adoType);
TypeDescriptor.GetProperties(adoConn)
["ConnectionString"].SetValue(adoConn, connectionString);
object connectionObject = adoConn;
bool success = (bool)msdascType.InvokeMember(
"PromptEdit", BindingFlags.Instance | BindingFlags.InvokeMethod,
null, msdascLink, new object[] { connectionObject });
if (success)
{
adoConn = connectionObject;
retVal = TypeDescriptor.GetProperties(adoConn)
["ConnectionString"].GetValue(adoConn) as string;
}
else
{
retVal = connectionString;
}
}
}
catch (NullReferenceException) { } // im Dialog wurde [Abbrechen] gewählt.
catch (Exception exp)
{
if (exp.InnerException == null)
MessageBox.Show(exp.Message, "Fehler in Verbindungszeichenfolge",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
else
{
MessageBox.Show(exp.Message + Environment.NewLine + Environment.NewLine
+ exp.InnerException.Message, "Fehler in Verbindungszeichenfolge",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
return retVal;
}
}