Hello!
I am a developer under training and i am working on a large project wich involves windows forms and sql server.
This program will be a personell planning system for a factory some day
<img src='http://bildr.no/thumb/1029350.jpeg' alt='1029350' />
I have some trouble with the code for my backgroundworker wich populates a datagridview.
1st run it takes 15-20ms trough 12 loops.
2nd run it takes 750ms for first loop, then 0-15ms for the rest
* I have checked there is no trouble with filling of datatables. The tableadapter.fill are done in the UI thread, and it is consistent of 10-20ms. The form is also set up tho make the backgrounworker.dowork on seperate user input.
so far i have found out that the datagridview.rows.add is the part which is holding the whole method back, it is running for 750ms on the 2. update cycle, on only the first new datagridview. It also behaves like this for the 3,4,5 and so one cycles, but only on the first datagridview. The first datagridview is always the one which is shown to the user.
The code disposes it if it exists a datagridview with the same name on the new update cycle. I have tried commenting out this with no difference to timespan (new update cycle)
foreach (Control c in this.tabControl1.TabPages[måned-1].Controls)
{
if (c.Name == "dgv" + måned)
{
}
}
form_load:
1. fill = 10ms
2. 12 runs with backgroundworker to create 12 new datagridview = 15-20ms each
btnUpdate_click:
1. fill = 10ms
2. 1 of 12 runs with backgroundworker to create 12 new datagridview = 690-800ms
3. 2 to 12 runs with backgroundworker to create 12 new datagridview = 0(!)-20ms
<pre lang="c#"><pre> DateTime dts = DateTime.Now;
foreach (DataRowView drv in dvBrukere)
{
int nyRow = dgv.Rows.Add();
dgv.Rows[nyRow].Cells[0].Value = drv["Avdeling"].ToString();
dgv.Rows[nyRow].Cells[1].Value = drv["Avdeling arbeidsplan"].ToString();
dgv.Rows[nyRow].Cells[2].Value = drv["Brukernavn"].ToString();
AnsattFraDato = DateTime.Parse(drv["Ansatt fra dato"].ToString());
GyldigTilDato = DateTime.Parse(drv["Gyldig til"].ToString());
teller = 0;
while (teller < dagerPrMåned)
{
teller++;
TelleDatoTidlig = new DateTime(år, måned, teller, 0, 0, 0);
TelleDatoSen = new DateTime(år, måned, teller, 23, 59, 59);
if((TelleDatoSen.DayOfWeek != DayOfWeek.Saturday) && (TelleDatoSen.DayOfWeek !=DayOfWeek.Sunday))
if ((AnsattFraDato <= TelleDatoSen) && (GyldigTilDato >= TelleDatoTidlig))
{
dgv.Rows[nyRow].Cells[teller.ToString()].Value = "Jobb";
dgv.Rows[nyRow].Cells[teller.ToString()].Style.BackColor = Color.LightGreen;
}
}
}
DateTime dtsto = DateTime.Now;
TimeSpan ts1 = dtsto - dts;
MessageBox.Show(ts1.Milliseconds.ToString());
which is takes from this:
<pre lang="c#"><pre>private void backGroundWorkerStart()
{
this.Cursor = Cursors.AppStarting;
LåsSkjema(true);
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork +=new DoWorkEventHandler(bgwDgvOppretter_DoWork);
bgw.WorkerReportsProgress = true;
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.RunWorkerAsync();
}
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
MessageBox.Show(e.Error.Message, "DoseStudio");
this.Cursor = Cursors.Default;
LåsSkjema(false);
KjørerBGW = false;
setSkjemaStatus("Sist oppdatert: " + DateTime.Now.ToString(), 100);
}
int step = 0;
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
step++;
setSkjemaStatus("Oppdaterer bakgrunnsmåned " + step, e.ProgressPercentage);
}
private delegate void OppdaterEnMånedDataDelegate(object sender, int år, int måned);
private void OppdaterEnMånedData(object sender, int år, int måned)
{
LåsSkjema(true);
if (sender == null)
{ }
else
{
if (sender.GetType().Equals(typeof(BackgroundWorker)))
this.Cursor = Cursors.AppStarting;
else
{
setSkjemaStatus("Oppdaterer denne måned", 50);
this.Cursor = Cursors.WaitCursor;
}
}
DateTime dtStart = DateTime.Now;
DateTime dtStopp;
TimeSpan ts;
string månedString =måned.ToString();
if(månedString.Length==1)
månedString=string.Format("00", måned);
foreach (Control c in this.tabControl1.TabPages[måned-1].Controls)
{
if (c.Name == "dgv" + måned)
{
}
}
AntallGangerKjørt++;
DataGridView dgv = new DataGridView();
typeof(DataGridView).InvokeMember("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, dgv, new object[] { true });
foreach (TabPage tp in tabControl1.TabPages)
{
if (Convert.ToInt32(tp.Name.Substring(tp.Name.Length - 2, 2)) == måned)
{
tp.Controls.Add(dgv);
}
}
dgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dgv.Dock = System.Windows.Forms.DockStyle.Fill;
dgv.Location = new System.Drawing.Point(0, 0);
dgv.Name = Guid.NewGuid().ToString();
dgv.Size = new System.Drawing.Size(964, 651);
dgv.TabIndex = 0;
_003_Util.dgwSetupHjelper dgws = new _003_Util.dgwSetupHjelper(dgv);
dgws.filter = false;
dgws.CopyPaste = true;
dgws.settOppDGW();
dgv.CellDoubleClick += new DataGridViewCellEventHandler(dgv_CellDoubleClick);
dgv.Columns.Clear();
dgv.Rows.Clear();
dgv.Columns.Add("Avdeling","Avdeling");
dgv.Columns.Add("Arbeidsplan","Arbeidsplan");
dgv.Columns.Add("Brukernavn","Brukernavn");
int customColumns = 3;
int teller=0;
int teller2;
while (teller < customColumns)
{
dgv.Columns[teller].Frozen = true;
dgv.Columns[teller].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
teller++;
}
int dagerPrMåned = DateTime.DaysInMonth(år, måned);
DateTime dtsisteIMåneden = new DateTime(år, måned, dagerPrMåned, 23, 59, 59);
DateTime dtFørsteIMåneden = new DateTime(år,måned, 1, 0, 0, 0);
DateTime dtIdag = DateTime.Now;
teller = 0;
while(teller < dagerPrMåned)
{
teller++;
dgv.Columns.Add(teller.ToString(), teller.ToString());
}
DateTime AnsattFraDato;
DateTime GyldigTilDato;
DateTime TelleDatoSen;
DateTime TelleDatoTidlig;
string rfilter = "";
if(strAvdeling != "Alle")
rfilter = "avdeling ='" + strAvdeling + "' and ";
if ((strAvdeling == "Produksjon") && (strAvdelingArbeidsplan != "Alle"))
rfilter = rfilter + " [Avdeling Arbeidsplan] ='" + strAvdelingArbeidsplan + "' and ";
DataView dvBrukere = new DataView(dtTblBrukere);
dvBrukere.RowFilter = rfilter + " [Ansatt fra dato]<='#" + dtsisteIMåneden.ToString() + "#' and [gyldig til]>='#" + dtFørsteIMåneden.ToString() + "#'";
DateTime dts = DateTime.Now;
foreach (DataRowView drv in dvBrukere)
{
int nyRow = dgv.Rows.Add();
dgv.Rows[nyRow].Cells[0].Value = drv["Avdeling"].ToString();
dgv.Rows[nyRow].Cells[1].Value = drv["Avdeling arbeidsplan"].ToString();
dgv.Rows[nyRow].Cells[2].Value = drv["Brukernavn"].ToString();
AnsattFraDato = DateTime.Parse(drv["Ansatt fra dato"].ToString());
GyldigTilDato = DateTime.Parse(drv["Gyldig til"].ToString());
teller = 0;
while (teller < dagerPrMåned)
{
teller++;
TelleDatoTidlig = new DateTime(år, måned, teller, 0, 0, 0);
TelleDatoSen = new DateTime(år, måned, teller, 23, 59, 59);
if((TelleDatoSen.DayOfWeek != DayOfWeek.Saturday) && (TelleDatoSen.DayOfWeek !=DayOfWeek.Sunday))
if ((AnsattFraDato <= TelleDatoSen) && (GyldigTilDato >= TelleDatoTidlig))
{
dgv.Rows[nyRow].Cells[teller.ToString()].Value = "Jobb";
dgv.Rows[nyRow].Cells[teller.ToString()].Style.BackColor = Color.LightGreen;
}
}
}
DateTime dtsto = DateTime.Now;
TimeSpan ts1 = dtsto - dts;
MessageBox.Show(ts1.Milliseconds.ToString());
DateTime dtManuellFraDato;
DateTime dtManuellTilDato;
DataView dvManuellAPlan = new DataView(dtArbeidsPlanUtlån);
dvManuellAPlan.RowFilter = "[Fra Dato]<='#" + dtsisteIMåneden.ToString() + "#' And [Til Dato] >='#" + dtFørsteIMåneden.ToString() + "#'";
dvManuellAPlan.Sort = "Brukernavn";
foreach (DataRowView drv in dvManuellAPlan)
{
dtManuellFraDato = DateTime.Parse(drv["Fra dato"].ToString());
dtManuellTilDato = DateTime.Parse(drv["Til dato"].ToString());
DataGridViewRow row = dgv.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Brukernavn"].Value.ToString().Equals(drv["Brukernavn"].ToString()))
.FirstOrDefault();
if (row != null)
{
int index = row.Index;
if (dtManuellFraDato < dtFørsteIMåneden)
teller = 1;
else
teller = dtManuellFraDato.Day;
if (dtManuellTilDato > dtsisteIMåneden)
teller2 = dagerPrMåned;
else
teller2 = dtManuellTilDato.Day;
while (teller <= teller2)
{
TelleDatoSen = new DateTime(år, måned, teller, 0, 0, 0);
if ((TelleDatoSen.DayOfWeek != DayOfWeek.Saturday) && (TelleDatoSen.DayOfWeek != DayOfWeek.Sunday))
{
row.Cells[teller.ToString()].Style.BackColor = Color.Purple;
row.Cells[teller.ToString()].Value = "Utlånt";
row.Cells[teller.ToString()].ToolTipText = "Utlånt til " + drv["Avdeling"].ToString() + " " + Convert.ToDateTime(drv["Fra dato"].ToString()).ToShortDateString() + "-" + Convert.ToDateTime(drv["Til dato"].ToString()).ToShortDateString();
}
teller++;
}
}
}
dvManuellAPlan.RowFilter =rfilter + dvManuellAPlan.RowFilter;
foreach (DataRowView drv in dvManuellAPlan)
{
dtManuellFraDato = DateTime.Parse(drv["Fra dato"].ToString());
dtManuellTilDato = DateTime.Parse(drv["Til dato"].ToString());
string[] radString = new string[dagerPrMåned + 3];
radString[0] = drv["Avdeling"].ToString();
radString[1] = drv["Avdeling arbeidsplan"].ToString();
radString[2] = drv["Brukernavn"].ToString();
if(dtManuellFraDato<dtFørsteIMåneden)
teller = 1;
else
teller = dtManuellFraDato.Day;
if(dtManuellTilDato > dtsisteIMåneden)
teller2 = dagerPrMåned;
else
teller2 = dtManuellTilDato.Day;
while (teller <= teller2)
{
TelleDatoSen = new DateTime(år, måned, teller, 0, 0, 0);
if ((TelleDatoSen.DayOfWeek != DayOfWeek.Saturday) && (TelleDatoSen.DayOfWeek != DayOfWeek.Sunday))
radString[teller+customColumns-1] = drv["Avdeling"].ToString();
teller++;
}
dgv.Rows.Add(radString);
}
DataView dvFerie = new DataView(dtFerieOversikt);
dvFerie.RowFilter = "[Fra Dato]<='#" + dtsisteIMåneden.ToString() + "#' And [Til Dato] >='#" + dtFørsteIMåneden.ToString() + "#'";
DateTime dtFerieFraDato;
DateTime dtFerieTilDato;
foreach (DataRowView drv in dvFerie)
{
dtFerieFraDato = DateTime.Parse(drv["Fra dato"].ToString());
dtFerieTilDato = DateTime.Parse(drv["Til dato"].ToString());
if (dtFerieFraDato < dtFørsteIMåneden)
teller = 1;
else
teller = dtFerieFraDato.Day;
if (dtFerieTilDato > dtsisteIMåneden)
teller2 = dagerPrMåned;
else
teller2 = dtFerieTilDato.Day;
string b;
if (drv["brukernavn"].ToString().Equals("phuhly"))
b = drv["brukernavn"].ToString();
DataGridViewRow row = dgv.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Brukernavn"].Value.ToString().Equals(drv["Brukernavn"].ToString()))
.FirstOrDefault();
if (row != null)
{
while (teller <= teller2)
{
if (drv["Status"].ToString().ToLower() == "godkjent")
{
row.Cells[teller.ToString()].Style.BackColor = Color.Yellow;
row.Cells[teller.ToString()].Value = "Ferie";
row.Cells[teller.ToString()].ToolTipText = Convert.ToDateTime(drv["Fra dato"].ToString()).ToShortDateString() + "-" + Convert.ToDateTime(drv["Til Dato"].ToString()).ToShortDateString() + " - " + drv["Type"].ToString() + " - \n" + drv["Kommentar"].ToString();
}
else if (drv["Status"].ToString().ToLower() == "registrert")
{
row.Cells[teller.ToString()].Style.BackColor = Color.Orange;
row.Cells[teller.ToString()].Value = "Feriesøknad";
row.Cells[teller.ToString()].ToolTipText = Convert.ToDateTime(drv["Fra dato"].ToString()).ToShortDateString() + "-" + Convert.ToDateTime(drv["Til Dato"].ToString()).ToShortDateString() + " - " + drv["Type"].ToString() + " - \n" + drv["Kommentar"].ToString();
}
teller++;
}
}
}
bool FremhevKolonne = false;
if ((år == DateTime.Today.Year) && (måned == DateTime.Today.Month))
{
FremhevKolonne = true;
}
DataView dvHelligdager = new DataView(dtHelligdager);
dvHelligdager.RowFilter = "[Dato] >= '#" + dtFørsteIMåneden.ToString() + "#' AND [Dato] <= '#" + dtsisteIMåneden.ToString() + "#'";
foreach(DataRowView drv in dvHelligdager)
{
teller = Convert.ToDateTime(drv["Dato"].ToString()).Day;
foreach(DataGridViewRow dgvr in dgv.Rows)
{
if (FremhevKolonne)
{
Font fnt = new Font(dgv.DefaultCellStyle.Font,FontStyle.Bold);
dgvr.Cells[DateTime.Today.Day.ToString()].Style.Font = fnt;
}
dgvr.Cells[teller.ToString()].Value = "";
dgvr.Cells[teller.ToString()].ToolTipText = drv["Tekst"].ToString();
dgvr.Cells[teller.ToString()].Style.BackColor = Color.FromArgb(255, 218, 122);
}
}
DateTime dtArbeidsPlanDato;
DataView dvArbeidsplan = new DataView(dtArbeidsplan);
dvArbeidsplan.RowFilter = "[Dato] >= '#" + dtFørsteIMåneden.ToString() + "#' AND [Dato] <= '#" + dtsisteIMåneden.ToString() + "#'";
dvArbeidsplan.Sort = "dato desc, avdeling";
foreach (DataRowView drv in dvArbeidsplan)
{
dtArbeidsPlanDato = DateTime.Parse(drv["Dato"].ToString());
string c = drv["Brukernavn"].ToString();
DataGridViewRow row = dgv.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Brukernavn"].Value.ToString().Equals(drv["Brukernavn"].ToString()))
.FirstOrDefault();
if (row != null)
{
if (drv["Funksjon"].ToString().ToLower().Contains("syk"))
{
row.Cells[dtArbeidsPlanDato.Day.ToString()].Value = "Syk";
row.Cells[dtArbeidsPlanDato.Day.ToString()].ToolTipText = "Fra arbeidsplan - " + drv["Funksjon"].ToString();
row.Cells[dtArbeidsPlanDato.Day.ToString()].Style.BackColor = Color.LightBlue;
}
if (drv["Funksjon"].ToString().ToLower().Contains("fri"))
{
row.Cells[dtArbeidsPlanDato.Day.ToString()].Value = "Fri";
row.Cells[dtArbeidsPlanDato.Day.ToString()].ToolTipText = "Fra arbeidsplan - " + drv["Funksjon"].ToString();
row.Cells[dtArbeidsPlanDato.Day.ToString()].Style.BackColor = Color.LightBlue;
}
if (row.Cells[dtArbeidsPlanDato.Day.ToString()].Value != null)
{
if ((drv["Funksjon"].ToString().ToLower().Contains("ferie")) && (row.Cells[dtArbeidsPlanDato.Day.ToString()].Value.ToString().ToLower() == "jobb"))
{
row.Cells[dtArbeidsPlanDato.Day.ToString()].Value = "Fri";
row.Cells[dtArbeidsPlanDato.Day.ToString()].ToolTipText = "Fra arbeidsplan - " + drv["Funksjon"].ToString();
row.Cells[dtArbeidsPlanDato.Day.ToString()].Style.BackColor = Color.LightBlue;
}
}
}
}
DateTime dtArbeidsplanAvvikDato;
DataView dvArbeidsplanAvvik = new DataView(dtArbeidsplanAvvik);
dvArbeidsplanAvvik.RowFilter = "[Gjelder dato] >= '#" + dtFørsteIMåneden.ToString() + "#' AND [Gjelder dato] <= '#" + dtsisteIMåneden.ToString() + "#'";
teller = 0;
foreach (DataRowView drArbeidsplanAvvik in dvArbeidsplanAvvik)
{
DataGridViewRow row = dgv.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["Brukernavn"].Value.ToString().Equals(drArbeidsplanAvvik["Brukernavn"].ToString()))
.FirstOrDefault();
if (row != null)
{
dtArbeidsplanAvvikDato = Convert.ToDateTime(drArbeidsplanAvvik["Gjelder dato"].ToString());
teller = dtArbeidsplanAvvikDato.Day;
row.Cells[teller.ToString()].Style.BackColor = Color.Green;
row.Cells[teller.ToString()].ToolTipText = "Arbeidsplan avvik - " + drArbeidsplanAvvik["Tekst"].ToString();
}
}
string[] radString2 = new string[dgv.Columns.Count];
int Antall = 0;
radString2[0] = "Summering";
radString2[1] = "Antall på jobb";
radString2[2] = "";
foreach (DataGridViewColumn dgvc in dgv.Columns)
{
if(_003_Util.Snacks.IsInteger(dgvc.Name))
{
Antall = 0;
foreach (DataGridViewRow dgrv in dgv.Rows)
{
if (dgrv.Cells[dgvc.Name].Value != null)
{
if ((dgrv.Cells[dgvc.Name].Value.ToString() == "Jobb") || (dgrv.Cells[dgvc.Name].Value.ToString().Equals(dgrv.Cells["Avdeling"].Value.ToString(), StringComparison.CurrentCultureIgnoreCase)))
{
Antall++;
}
}
}
if(Antall!=0)
radString2[Convert.ToInt32(dgvc.Name)+2] = Antall.ToString();
}
}
dgv.Rows.Add(radString2);
DataGridViewBand band = dgv.Rows[dgv.Rows.Count - 1];
DataGridViewCellStyle style = new DataGridViewCellStyle();
style.BackColor = Color.WhiteSmoke;
band.DefaultCellStyle = style;
dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.Font = new Font("Times New Roman", 9, FontStyle.Bold);
Antall = 0;
radString2 = new string[dgv.Columns.Count];
radString2[0] = "Summering";
radString2[1] = "Antall ikke på jobb";
radString2[2] = "";
foreach (DataGridViewColumn dgvc in dgv.Columns)
{
if (_003_Util.Snacks.IsInteger(dgvc.Name))
{
Antall = 0;
foreach (DataGridViewRow dgrv in dgv.Rows)
{
if (dgrv.Index < dgv.Rows.Count-1)
{
if (dgrv.Cells[dgvc.Name].Value != null)
{
if ((dgrv.Cells[dgvc.Name].Value.ToString() != "Jobb") && (!dgrv.Cells[dgvc.Name].Value.ToString().Equals(dgrv.Cells["Avdeling"].Value.ToString(), StringComparison.CurrentCultureIgnoreCase)))
{
if (dgrv.Cells[dgvc.Name].Value.ToString() != "")
Antall++;
}
}
}
}
if (Antall != 0)
radString2[Convert.ToInt32(dgvc.Name) + 2] = Antall.ToString();
}
}
dgv.Rows.Add(radString2);
band = dgv.Rows[dgv.Rows.Count - 1];
style = new DataGridViewCellStyle();
style.BackColor = Color.WhiteSmoke;
band.DefaultCellStyle = style;
dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.Font = new Font("Times New Roman", 9, FontStyle.Bold);
dgv.Refresh();
if ((måned == dtIdag.Month) && (år == dtIdag.Year))
if (dgv.Rows.Count > -1)
{
dgv.CurrentCell = dgv[dtIdag.Day.ToString(), 0];
dgv.CurrentCell.Selected = true;
}
if (sender == null)
{ }
else
{
if (sender.GetType().Equals(typeof(BackgroundWorker)))
{
}
else
{
this.Cursor = Cursors.Default;
setSkjemaStatus("Ferdig denne måned", 100);
}
}
dtStopp = DateTime.Now;
ts = dtStopp - dtStart;
this.toolStripStatusLabel1.Text = "Sist oppdatert: " + DateTime.Now.ToString() + " [" + AntallGangerKjørt + "][" + AntallGangerLastet + "]";
}
The code is meant for experiment and will not look like this in future.