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