

Architektura formulářové aplikace C#
Ahoj,
před nějakým časem jsem se tady ptal, jak navrhnout aplikaci.
Původně se mi moc nechtělo, ale uposlechl jsem Wikanův návrh.
V podstatě jde o databazovou aplikaci, a vytvářím základní objekt, který bude nějak spravovat tok dat mezi formuláři a databází.
Co je hotové, je objekt, který spravuje naplnění formuláře. Dále by zde mělo fungovat i uložení + případně INZERT údajů do DB.
Na uložení jsem se trochu zasekl, a sem směřuji můj dotaz.
Zatím uvažuji jen editaci či vkládání jednoho záznamu,
Zatím objekt tedy vypadá nějak takto:
class CSshowFillClass
{
public System.Windows.Forms.Form form;
string table;
string columnName;
int id;
// konstruktor
public CSshowFillClass(System.Windows.Forms.Form form, string table, string columnName, int id = 0)
{
this.form = form;
this.id = id;
this.columnName = columnName;
this.table = table;
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["aplikacka_NET.Properties.Settings.ConnectionString"].ConnectionString);
conn.Open();
SqlDataReader rdr = null;
SqlCommand cmd;
if (id != 0)
{
cmd = new SqlCommand("SELECT * FROM aplikackaDB.dbo."+ table +" where "+ columnName +" = " + id.ToString(), conn);
}
else
{
return;
}
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
foreach (Control ctrl in this.form.Controls)
{
string ControlName = ctrl.Name.ToString().Substring(3, ctrl.Name.ToString().Length - 3);
if (ColumnExists(rdr, ControlName))
{
ctrl.Text = rdr[ControlName].ToString(); // NAPLNENI TEXTOVÝCH POLÍ HODNOTAMI Z DB
}
string controlType = ctrl.GetType().ToString();
}
}
}
public bool ColumnExists(IDataReader reader, string columnName)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
return false;
}
public bool saveForm()
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["aplikacka_NET.Properties.Settings.ConnectionString"].ConnectionString);
conn.Open();
SqlCommand cmd;
cmd = new SqlCommand("SELECT * FROM aplikackaDB.dbo." + table + " where " + columnName + " = " + this.id.ToString(), conn);
SqlDataReader rdr = cmd.ExecuteReader();
string columnsNames = String.Empty;
while (rdr.Read())
{
foreach (Control ctrl in this.form.Controls)
{
string ControlName = ctrl.Name.ToString().Substring(3, ctrl.Name.ToString().Length - 3); //str.Substring(10, str.Length-10)
if (ColumnExists(rdr, ControlName))
{
columnsNames += ControlName + "= '"+ ctrl.Text +"'," ;
}
string controlType = ctrl.GetType().ToString();
}
}
columnsNames = columnsNames.Remove(columnsNames.Length - 1);
rdr.Close();
cmd = new SqlCommand("UPDATE aplikackaDB.dbo." + table + " SET "+ columnsNames +" WHERE " + columnName + " = " + this.id.ToString(), conn);
cmd.ExecuteNonQuery();
return true;
}
public void ShowForm()
{
form.Show();
}
}
Potíž mám ale s jeho použitím.
Konkrétně objekt přebírá tato data: ukazatel na formulář, název DB tabulky, název sloupce, ID řádku (záznamu)
Když použiji v hlavním těle následující konstrukci:
Smlouvy formSmlouvy = new Smlouvy();
CSshowFillClass csshowFillClass = new CSshowFillClass(formSmlouvy, "Smlouvy", "IDNAVRH", 245);
formSmlouvy.Show();
Tak se formulář bez problému naplní daty a zobrazí. Potíž mám ale v tom, jak nyní tato data uložit (UPDATE) v DB.
Protože pokud nechám proběhnout např. tento kód:
Smlouvy formSmlouvy = new Smlouvy();
CSshowFillClass csshowFillClass = new CSshowFillClass(formSmlouvy, "Smlouvy", "IDNAVRH", 245);
formSmlouvy.Show();
csshowFillClass.saveForm();
Tak se kvůli fungování Windows (WIN32 API) nejprve provedou negrafické operace a teprve pak se form zobrazí.
Takže kód nejde "postupně".
Co navrhujete?