[c#]Indexation d'objet, out of memory
Bonjour,
je souhaite représenter les places d'un théâtre sur un form et du coup, j'ai 720 CheckBox sur mon form (oui rien que ça). Là où j'ai surtout un problème, c'est que dès que je fais trois refresh de mon form, j'ai un out of memory, donc je cherche à optimiser mon code et j'ai donc aussi voulu utiliser un INDEX, mais pas possible (comme on pouvait le faire en VB6). J'ai donc utilisé le "pour chaque ctrl c dans les_controles_de_ta_form", vérifié que c'est un checkbox par "si c est checkbox" et là, pas de bol, pas moyen de faire directement
c.checked = true; car la propriété n'est pas directement connue, je dois avant faire
CheckBox cb = new CheckBox();
cb = (CheckBox)cntrl;
cb.checked = true;
Ce que je n'aime pas, car je dois chaque fois recréer un objet de type CheckBox alors qu'il existe. Idem pour y assigner un tooltip, ce qui fait que j'arrive à un out of memory, enfin je pense car il réinitialise des variables à chaque fois, pourtant, je vais des "dispose" en fin de procédure.
comment est-ce que je pourrais faire pour ne pas rencontrer ce problème ? Comment est-ce que je pourrais directement utiliser mes checkbox qui sont définis dans le form ?
Pour vous aider à comprendre mon problème voici le code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsApplication1
{
public partial class PlaceForm : Form
{
public CheckBox[] c = new CheckBox[721];
public ToolTip[] tooltip = new ToolTip[721];
public PlaceForm()
{
InitializeComponent();
RefreshPlace();
}
private void PlaceForm_Load(object sender, EventArgs e)
{
}
public void RefreshPlace()
{
String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=theatre.mdb";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
String queryString = "SELECT * FROM PlacePublic";
OleDbCommand command = new OleDbCommand(queryString, connection);
connection.Open();
OleDbDataReader reader = command.ExecuteReader();
int id_siege;
String rang;
String siege;
String Nom;
Boolean disponible;
Boolean Vip;
//ToolTip tooltip = new ToolTip();
while (reader.Read())
{
id_siege = (int)reader["ID_siege"];
rang = reader["rang"].ToString();
siege = reader["siege"].ToString();
Nom = reader["Nom"].ToString();
disponible = (Boolean)reader["Disponible"];
Vip = (Boolean)reader["VIP"];
foreach (Control cntrl in this.Controls.Find("CheckBox" + id_siege, true))
{
if (cntrl is CheckBox)
{
//Console.WriteLine(cntrl.Name +" "+ id_siege + " " + rang + " " + siege + " " + Nom);
//CheckBox c = new CheckBox();
//c = (CheckBox)cntrl;
c[id_siege] = (CheckBox)cntrl;
if (Nom.Equals(""))
c[id_siege].Checked = false;
else
c[id_siege].Checked = true;
tooltip[id_siege] = new ToolTip();
tooltip[id_siege].AutomaticDelay = 10;
tooltip[id_siege].AutoPopDelay = 10000;
if (Vip)
{
tooltip[id_siege].ToolTipTitle = "Place VIP" + rang + " " + siege;
tooltip[id_siege].BackColor = Color.AliceBlue;
}
else
tooltip[id_siege].ToolTipTitle = "Place " + rang + " " + siege;
if (Nom.Equals(""))
{
tooltip[id_siege].SetToolTip(c[id_siege], "Libre");
c[id_siege].BackColor = Color.Green;
}
else
{
c[id_siege].BackColor = Color.Red;
tooltip[id_siege].SetToolTip(c[id_siege], "Réservé par " + Nom + " ");
}
if (!disponible)
{
c[id_siege].Enabled = false;
c[id_siege].Visible = false;
}
}
}
}
reader.Close();
connection.Close();
reader.Dispose();
command.Dispose();
connection.Dispose();
}
}
private void RefreshButton_Click(object sender, EventArgs e)
{
this.RefreshPlace();
}
private void PlaceForm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose(true);
}
}
} |
D'avance merci,
Pierre