У меня есть программа, которая обновляет два объекта DataGridView каждую минуту с помощью запроса MySQL из нашей внутренней базы данных заказов, чтобы мы могли отслеживать более старые заказы и следить за их обработкой.
Это работает хорошо,но если вы оставите программу включенной, она начнет работать все медленнее и медленнее, и вы действительно заметите это через день или около того.Перезапуск программы исправляет это, но я действительно хотел бы знать, почему я не могу просто оставить его запущенным.
Вот код таймера и функция, которую он вызывает:
private void timer1_Tick(object sender, EventArgs e)
{
UpdateOrderDisplay();
}
private void UpdateOrderDisplay()
{
grdOrderItems.Rows.Clear();
grdHoldOrders.Rows.Clear();
string strsql;
string CustomerName;
string MyConString = "SERVER=**********;" + "DATABASE=***********;" + "UID=************;" + "PASSWORD=***********;";
using (MySqlConnection connection = new MySqlConnection(MyConString))
{
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
strsql = "select * from orders where ship_reference=0 and OnHold =0 order by order_id asc";
command.CommandText = strsql;
connection.Open(); Reader = command.ExecuteReader();
while (Reader.Read())
{
if (Reader["payment_date"].ToString() != "")
{
if (Reader["custom"].ToString().Contains("~*"))
{
CustomerName = Reader["custom"].ToString().Substring(0, Reader["custom"].ToString().IndexOf("~"));
}
else
{
CustomerName = Reader["shipping_address_name"].ToString();
}
grdOrderItems.Invoke(new MethodInvoker(() => grdOrderItems.Rows.Add(Convert.ToDateTime(Reader["payment_date"].ToString().Substring(0, 21)).ToString(), Reader["txn_id"].ToString(), CustomerName, Reader["mc_gross"].ToString(), Reader["memo"].ToString(), Reader["order_id"].ToString())));
}
}
connection.Close();
strsql = "select * from orders where OnHold =1 order by order_id asc";
command.CommandText = strsql;
connection.Open(); Reader = command.ExecuteReader();
while (Reader.Read())
{
if (Reader["payment_date"].ToString() != "")
{
if (Reader["custom"].ToString().Contains("~*"))
{
CustomerName = Reader["custom"].ToString().Substring(0, Reader["custom"].ToString().IndexOf("~"));
}
else
{
CustomerName = Reader["shipping_address_name"].ToString();
}
grdHoldOrders.Invoke(new MethodInvoker(() => grdHoldOrders.Rows.Add(Convert.ToDateTime(Reader["payment_date"].ToString().Substring(0, 21)).ToString(), Reader["txn_id"].ToString(), CustomerName, Reader["mc_gross"].ToString(), Reader["memo"].ToString(), Reader["order_id"].ToString(),Reader["Hold_Review_Date"].ToString().Substring(0,Reader["Hold_Review_Date"].ToString().IndexOf(" ")),Reader["payer_email"].ToString())));
}
}
connection.Close();
}
}
Кроме того, в случае, если это уместно, вот код, который я использую, чтобы закрасить строки объекта DataGridView, чтобы мы могли легко определить, какой порядок более старый:
private void grdOrderItems_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
grdOrderItems.RowPrePaint += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(this.grdOrderItems1_RowPrePaint);
}
private void grdOrderItems1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex <= grdOrderItems.Rows.Count - 1)
{
string StringNow = DateTime.Now.ToString();
string NowTime = StringNow.Substring(StringNow.IndexOf(" ")+1, StringNow.Length- StringNow.IndexOf(" ")-1);
string OrderDateTime = grdOrderItems.Rows[e.RowIndex].Cells[0].Value.ToString().Substring(0, grdOrderItems.Rows[e.RowIndex].Cells[0].Value.ToString().IndexOf(" ")+1) + NowTime;
if ((Convert.ToDateTime(StringNow) - Convert.ToDateTime(OrderDateTime)).Days > 2)
{
grdOrderItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Tomato;
}
else
{
if ((Convert.ToDateTime(StringNow) - Convert.ToDateTime(OrderDateTime)).Days > 1)
{
grdOrderItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
}
else
{
if ((Convert.ToDateTime(StringNow) - Convert.ToDateTime(OrderDateTime)).Days > 0)
{
grdOrderItems.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Tan;
}
}
}
}
}