|
i load this controls all from a list with foreach, so it has no loop, where it can't drop out.
|
|
|
|
|
softwarejaeger wrote: i have a lot of classes in there and in my form, yes there are a lot of controls too.
You would have to have an obscene number of controls before you would be running out of memory for that reason...
softwarejaeger wrote: i think thats not a "code" problem...
I think that it is... but that doesn't really matter, the method of isolating the problem is the same. Set a breakpoint before the code that opens the second form, and single step through the code to determine what's happening and what part of your code that is causing/triggering the problem.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
what do you mean with "obscene" number of controls... i think at my project in that form i have round about 3000 controls.
i think it's a problem with the drawing of the second form or drawing in common... because, if i open the form, i have relly graphics problems. for example the taskbar gets on top, everything is black, the title-bar of the form isn't shown, now i see a banner of this website is out of the window oO. it looks like everything hangs here.... what to do?
|
|
|
|
|
softwarejaeger wrote: i think at my project in that form i have round about 3000 controls.
Maite, are you sure that you have 3000 controls on your form.
What do you or the user do with these many controls?
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Ok so 3000 controls on a form is an obscene number and should probably qualify as a coding horror. You need to redesign your app. I'm gobsmacked, 3000 controls wow.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
they're all needed, i show a "table" with them from data from an file. each control is like a cell...
so have you maybe an better idea to show such big amount of controls? dataGrids isn't the right for my project and the table-layout-panel doesn't make it even better
|
|
|
|
|
Do a custom control and draw every cell yourself!
|
|
|
|
|
ehm... i don't know exactly what you mean, but i do it this way...
i have a own control, where i load the ~3000 "cell-control-classes" in... and then i have a method "DrawMe()" where i show every control is in there and put them to the right location with the right size...
that's all about it, thats not very much code and so on, so i don't understand what you mean with "Do a custom control"... have you an example or do we both mean the same?
|
|
|
|
|
Search around for custom drawn controls .
|
|
|
|
|
Instead of adding the cells as controls to have them drawn, use the Paint event to draw them yourself.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
ehm i have custom controls for the cells... they are all classes with the paint method, where they're drawn and some other methods.
ok but what is now when i want to change one cell? so what to do if i change their backgroundColor, because the backgroundColor indicates a value from this cell...
because i think you mean i shoudl draw lines and rectangles to draw the controls or? or can i take the graphics from another class to the form?
|
|
|
|
|
Do not use a control for every little piece of content. This is too heavy weight.
softwarejaeger wrote: because i think you mean i shoudl draw lines and rectangles to draw the controls or?
Exactly that. And dont be scared. It is actually one of the funner parts of programming
|
|
|
|
|
and how can i interact with the cell then? i mean... clicking isn't really a problem, i get the coordinates of the mouse and so on... but... maybe selecting or changing... how to do that in you way? i mean if i see a good way to do this i would do this, but i think it's not that what i really need
|
|
|
|
|
When needed, you can put a 'proper' control there for the interaction, once done, remove the control.
|
|
|
|
|
could you make an example for that? i don't understand what you mean with a "proper" control
|
|
|
|
|
You're not running out of memory, you're running out of GDI handles (which produces visual errors and/or an OutOfMemoryException).
A process is limited to 10000 handles in Windows XP (even less in previous versions), and each Windows Forms control takes 1 handle (maybe even more than one).
Suggestions:
- virtualize your table (only allocate objects for the visible region)
- implement your table as a single Windows Forms control
|
|
|
|
|
what do you mean with "virtualize" your table? can you give an example?
and how should i implement my table as a single windows forms control? it is a user-control which contents the ~3000 other "cell"-user-controls... how could i implement as a single windows forms control?
|
|
|
|
|
Virtualizing means that while the user scrolls through the table, the controls that enter the visible region are created and the controls that leave the visible region are disposed.
Implement as single control: don't use UserControls. Your cells should not derive from any Windows Forms class. Then, in the Paint method of the table control, call the paint methods of your cell objects (pass them the Graphics object and the position to draw to).
|
|
|
|
|
ok... is there any "property" i can set for virtualizing or must i make that "manually" but how can i do this then? well i mean, i put all UserControls to their Location, and then disposing shouldn't be a problem, but how can i show them again?
and exactly that with the "grabbing" the Graphics object from the control and draw it is that what i want, but with wich method put i that graphics object to the panel? can you give an example?
thanks...
|
|
|
|
|
You have to do it manually. Whenever the user scrolls, dispose the controls going out of view and create new controls for the items coming into view.
Or, the alternative solution (IMHO better):
Use the Paint event of the control and draw using the e.Graphics object.
Something like this:
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
foreach (Cell c in cells) {
c.Paint(e.Graphics, new Rectangle(...));
}
}
class Cell {
public void Paint(Graphics g, Rectangle r) {
}
}
You'll have to write the code to manage the cells and their drawing positions.
|
|
|
|
|
ok thanks, i'll test it tomorrow and will tell you if it works thanks
|
|
|
|
|
hello, and how can i make this to show only the controls, they're needed? With the method "Hide" and "Show"? To find out which isn't needed is no problem, but what must i tell my UserControls to say them, that they didn needed or needed now?
|
|
|
|
|
well... now i made following...
a table control (like i had before) and a panel... i load now all cells (usercontrols) and so on in a list...
at first i start the method(cellArrange()) which tolds the cells their right position... then and if i scroll or resize my control, i search for all cells in the list which are in the visible region... now when it is visible, it says "panel1.Controls.Add(cell)" and if it shouldnt visible "panel1.Controls.Remove(cell)" but i get the same errors like before (out of memory) what to do?
|
|
|
|
|
Can I ask *why* a datagrid isn't right for your project? There are a lot of 3rd party grid controls out there that can do custom editors if that's what you need.
|
|
|
|
|
softwarejaeger wrote: i think at my project in that form i have round about 3000 controls.
Can you remember what they all do???
|
|
|
|