Automatisches Nummerieren von Steuerelement-Array's
Frank Dzaebel, erstellt am: 10.12.2005, zuletzt geändert:  29.5.2007
Kategorie: Windows Forms, .NET-Version: 1.1, [Download]

Will man Steuerelemente automatisch nummerieren, so kann man dies über ihren Namen erreichen. Hier wird eine von CollectionBase abgeleitete Klasse benutzt, die in ihrer Add-Methode über ein BinarySearch(tbx,textBoxComparer) ein  Insert(index,tbx) aufgerufen wird. Der textBoxComparer vergleicht die TextBoxen anhand der Zahl in den Steuerelement-Namen durch ein einfaches Regex. In diesem Beispiel werden die Werte aus einer Access-DB geholt und nach Änderung in diese zurück gespeichert. 
Für .NET 2.0 siehe auch hier.


private string dataTableName = "TextBoxen";
private DataSet ds = new DataSet(); private DataTable dt; 
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
private TextBoxen autoTbs = new TextBoxen();
private TextBoxen manuTbs = new TextBoxen();

private void Form1_Load(object sender, System.EventArgs e)
{
  InitControls(this); InitDatabase();
  dataGrid1.DataSource = ds.Tables[dataTableName];
  for (int i=0; i<autoTbs.Count; i++)
    autoTbs[i].Text = dt.Rows[i]["Automatisch"].ToString();
  for (int i=0; i<manuTbs.Count; i++)
    manuTbs[i].Text = dt.Rows[i]["Manuell"].ToString();
}

private void btnSichern_Click(object sender, System.EventArgs e)
{
  for (int i=0; i<manuTbs.Count; i++)
    dt.Rows[i]["Manuell"] = manuTbs[i].Text;
  dataAdapter.Update(ds.Tables[dataTableName]);
}

public class TextBoxen : CollectionBase 
{ 
private TextBoxComparer textBoxComparer = new TextBoxComparer(); public TextBox this[int index] { get {return (TextBox) this.List[index];} set {this.List[index] = value;} } public void Add(TextBox tbx) { int index = this.InnerList.BinarySearch(tbx, textBoxComparer); if (index<0) index = Math.Abs(index)-1; this.List.Insert(index, tbx); } class TextBoxComparer : IComparer { private int Index(object tb) { return int.Parse(Regex.Match(((TextBox)tb).Name, "\\d+").Value); } public int Compare(object x, object y) { return Index(x).CompareTo(Index(y)); } } } private void InitDatabase() { string dataBaseName = "Texte.mdb"; string dataSource = Path.Combine(Application.StartupPath, dataBaseName); if (!File.Exists(dataSource)) dataSource = Path.Combine(Application.StartupPath, @"..\..\"+dataBaseName); if (!File.Exists(dataSource)) { MessageBox.Show("Datenbank existiert nicht: " + dataBaseName); return; } dataSource = Path.GetFullPath(dataSource); string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=\""+ dataSource + "\""; string selectQuery = "Select * From " + dataTableName; try { OleDbConnection conn = new OleDbConnection(connectionString); dataAdapter.SelectCommand = new OleDbCommand(selectQuery, conn); OleDbCommandBuilder cb = new OleDbCommandBuilder(dataAdapter); dataAdapter.Fill(ds, dataTableName); } catch (OleDbException exp) { foreach (OleDbError err in exp.Errors) MessageBox.Show(err.Message); } dt = ds.Tables[dataTableName]; } private void InitControls(Control control) { foreach (Control ctl in control.Controls) { if (ctl.Controls.Count > 0) InitControls(ctl); TextBox tb = ctl as TextBox; if (tb != null) { if (tb.Name.EndsWith ("a")) manuTbs.Add(tb); if (!tb.Name.EndsWith("a")) autoTbs.Add(tb); } } }