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;
    }
  }