Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#]MultiView gedrag in Forms applicatie

Pagina: 1
Acties:

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Bij een .net webapplicatie heb je een MultiView, waarmee je een bepaald gebied andere inhoud kan laten weergeven.

Bij een Forms applicatie heb je de MultiView echter niet.. Dus ik probeer een paar panels op elkaar te stapelen en alleen het panel dat getoond moet worden op Visible=true te zetten, de rest is dan false, dus onzichtbaar. Het idee is dat aan de hand van een gekozen waarde uit een ComboBox het juiste panel getoond wordt.
Het vervelende is alleen dat dit niet werkt :( het juist zetten van Visible werkt prima, maar van de panels is er maar 1 die dan ook daadwerkelijk getoond wordt, bij de andere blijft de plek leeg :? Sleep ik zo'n panel echter naar een andere plek in de applicatie, dan wordt die panel daar wél getoond.. Het op elkaar leggen van de panels zorgt blijkbaar voor problemen?

Screenshot voor de duidelijkheid:
Afbeeldingslocatie: http://tweakers.net/ext/f/6ttTjPsoCJAuKMn0AIRzvB6m/full.png

Iemand een ideetje hoe dit op te lossen is?

Kater? Eerst water, de rest komt later


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Volgens mij komt het doordat je al je andere panels als Child van je 1e panel hebt gemaakt. Je legt ze dus niet op elkaar.
Zet je je 1e panel visible=false dan verdwijnen al je andere panels ook.
code:
1
2
3
panel1
   \---panel2
   \---panel3

Als je nu het 2e panel ergens anders heen sleept, krijg je dit
code:
1
2
3
panel1
   \---panel3
panel2


Waarschijnlijk staat er in je designer.cs ongeveer zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 
// panel1
// 
this.panel1.Controls.Add(this.panel2); // << dit is de boosdoener in dit geval!
this.panel1.Location = new System.Drawing.Point(252, 13);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(362, 196);
this.panel1.TabIndex = 1;
this.panel1.Visible = false;
// 
// panel2
// 
this.panel2.Location = new System.Drawing.Point(65, 47);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(200, 100);
this.panel2.TabIndex = 0;


Hmm, even gauw getest: door this.panel1.Controls.Add(this.panel2) weg te halen schiet het nog niet echt op.
Toch wel, alleen moet je dan
0: verwijder this.panel1.Controls.Add(panel2)
1: handmatig panel2 aan je Form1 koppelen (this.Controls.Add(panel2)) en
2: de lokatie handmatig aanpassen. Deze zal in 1e instantie relatief aan je panel1 zijn.

Makkelijkere oplossing:
Sloop het TabControl door de tabs te verwijderen.

[ Voor 66% gewijzigd door TeeDee op 28-02-2008 16:11 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Het moet inderdaad te maken hebben met het feit dat die panels in elkaar komen te hangen, maar hoe dit te voorkomen is dan de vraag :P

Ik zal even in de designer.cs file rondneuzen.

[ Voor 88% gewijzigd door Haan op 28-02-2008 16:14 ]

Kater? Eerst water, de rest komt later


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Haan schreef op donderdag 28 februari 2008 @ 16:05:
Het moet inderdaad te maken hebben met het feit dat die panels in elkaar komen te hangen, maar hoe dit te voorkomen is dan de vraag :P

Ik zal even in de designer.cs file rondneuzen.
Check even mijn laatste toevoeging. Een panel in een panel zorgt er dus automatisch voor dat het 2e panel een child wordt van het 1e panel.

Omdat dit automatisch gebeurt krijg je bij elke wijziging (afaik) op je form het gezeik dat je dat moet aanpassen.

Pak dan iets van een TabControl, sloop de tabs eruit en je bent er ook.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
C#:
1
this.panel1.Controls.Add(this.panel2); // << dit is de boosdoener in dit geval!

Deze constructie staat nergens, wat ik wel zie, is dat de TabIndex van veel panels hetzelfde nummer heeft. Maar dat aanpassen heeft ook geen effect.

Maar verschillende TabControls 'stapelen' zou wel moeten werken dus?

Kater? Eerst water, de rest komt later


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom maak je dan niet gewoon meerdere user controls. Afhankelijk van de waarde van de dropdown laad je gewoon dynamisch een ander user control.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void ShowDataPanel(string dataType)
{
  UserControl dataTypePanel = GetPanel(dataType);
  this.panel1.Controls.Clear(); //remove previously loaded data panels
  this.panel1.Controls.Add(dataTypePanel);
}

protected UserControl GetPanel(string dataType)
{
  switch(panelName.ToString())
  {
    case "nvarchar":
    case "varchar":
      return new NVarCharPanel();
    case "datetime":
      return new DateTimePanel();
    default:
      throw new NotSupportedException( "Database type is not supported!" );  
  }
}


Een dergelijke implementatie maakt het ook eenvoudiger code te hergebruiken. Je kunt ook een kijken nemen bij de application blocks van Microsoft zoals Composite UI Appliaction Block en het User Interface Process Appliaction Block.

If it isn't broken, fix it until it is..


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Haan schreef op donderdag 28 februari 2008 @ 16:19:
C#:
1
this.panel1.Controls.Add(this.panel2); // << dit is de boosdoener in dit geval!

Deze constructie staat nergens, wat ik wel zie, is dat de TabIndex van veel panels hetzelfde nummer heeft. Maar dat aanpassen heeft ook geen effect.
De TabIndex is dan ook heel iets anders; wat jij zoekt (als het al van toepassing is hier) is de Z-Index / Z-Order.

Maar over 'Tabindex' gesproken, waarom gebruik je geen tab-control zonder (visible) tabs? Ik weet even zo snel niet of dat kan, maar dat lijkt me geschikter.

[ Voor 22% gewijzigd door RobIII op 28-02-2008 16:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Exact die constructie mogelijk niet nee ;)

Het 'stapelen' zou wel moeten werken, alleen zal je constant moeten verifieren dat er niet het volgende voor komt:

(ik zal het even neerzetten in de juiste volgorde)
C#:
1
2
3
4
this.Controls.Add(Panel1); // voeg panel1 aan je Form toe
this.Panel1.Controls.Add(Panel2); //voeg panel2 aan Panel 1 toe
this.Panel1.Controls.Add(Panel3); //voeg panel3 aan Panel 1 toe
this.Panel3.Controls.Add(Panel4); //voeg panel4 aan Panel 3 toe
Terwijl je eigenlijk dit wil hebben.
C#:
1
2
3
4
this.Controls.Add(Panel1); // voeg panel1 aan je Form toe
this.Controls.Add(Panel2); // voeg panel2 aan je Form toe
this.Controls.Add(Panel3); // voeg panel3 aan je Form toe
this.Controls.Add(Panel4); // voeg panel4 aan je Form toe


Visual studio zal standaard het eerste doen. Ook vermoed ik dat tijdens het toevoegen van bijvoorbeeld een 5e panel (dmv een nieuw panel te slepen) de rest opnieuw gerangschikt worden. Hierdoor blijf je bezig.

Zoals ik al zei: sloop het TabControl.

Verder is de suggestie van Niemand_Anders ook plausibel.

[ Voor 16% gewijzigd door TeeDee op 28-02-2008 16:30 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Ok, bedankt voor de tips! M'n werkweek zit er weer bijna op :P dus ik laat waarschijnlijk volgende week even horen of het is gelukt ;)

Kater? Eerst water, de rest komt later


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
TeeDee schreef op donderdag 28 februari 2008 @ 16:10:
Check even mijn laatste toevoeging. Een panel in een panel zorgt er dus automatisch voor dat het 2e panel een child wordt van het 1e panel.

Omdat dit automatisch gebeurt krijg je bij elke wijziging (afaik) op je form het gezeik dat je dat moet aanpassen.

Pak dan iets van een TabControl, sloop de tabs eruit en je bent er ook.
Volgens mij ligt dat aan welk control de focus heeft als je CTRL+V doet. Als je eerst het "buitenste" panel selecteert zou dit niet moeten gebeuren.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

farlane schreef op donderdag 28 februari 2008 @ 16:40:
[...]
Volgens mij ligt dat aan welk control de focus heeft als je CTRL+V doet. Als je eerst het "buitenste" panel selecteert zou dit niet moeten gebeuren.
Dat zou heel goed mogelijk zijn, maar hou jij daar rekening mee?
Dan heb je wat dat betreft meer discipline dan ik. Zeker, in het geval van drag 'n' drop kan ik me voorstellen dat je wel eens een f*ckup maakt. Nu heb ik minder ervaring met Forms dan met Web en Webcontrols plaats ik toch altijd handmatig via de code view.

[ Voor 36% gewijzigd door TeeDee op 28-02-2008 17:01 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Ik heb net even de manier van TabControls stapelen geprobeerd, dat kan opzich, maar in een TabControl kan je alleen TabPages stoppen, dus dan zit ik met een tabblad opgescheept..

Kater? Eerst water, de rest komt later


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
TeeDee schreef op donderdag 28 februari 2008 @ 16:43:
[...]

Dat zou heel goed mogelijk zijn, maar hou jij daar rekening mee?
Ja

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Haan schreef op donderdag 28 februari 2008 @ 16:53:
Ik heb net even de manier van TabControls stapelen geprobeerd, dat kan opzich, maar in een TabControl kan je alleen TabPages stoppen, dus dan zit ik met een tabblad opgescheept..
Set Appearance to Buttons.
Set SizeMode to Fixed.
Set ItemSize to (0,1)
:9~
of
C#:
1
2
3
4
5
6
7
8
tabControl1.Region = new Region(
            new RectangleF(
                    this.tabPage1.Left,
                    this.tabPage1.Top,
                    this.tabPage1.Width,
                    this.tabPage1.Height
                )
            );

Maar dan begint het toch maar ranzig te worden. Ik denk dat je beter de mogelijkheid van Niemand_Anders kan gebruiken.

Edit: (ja, ik heb ff niks te doen):
Je kan het e.e.a. ook in FlowLayoutpanel gooien. Werkt ook prima ;)
da's nummer 2 he vandaag :+

[ Voor 46% gewijzigd door TeeDee op 28-02-2008 17:12 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
TeeDee schreef op donderdag 28 februari 2008 @ 17:03:
[...]

Set Appearance to Buttons.
Set SizeMode to Fixed.
Set ItemSize to (0,1)
:9~
Dat werkt goed hoor!

TeeDee O+

Kater? Eerst water, de rest komt later


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Dit is een probleem dat ik ook veel tegenkom. Je ziet het ook wel als mensen zelfs Wizards willen maken, waarvoor helaas ook geen standaard .NET control voor is. CodeProject heeft daar een paar aardige implementaties voor.

Nog een tip voor mensen met Visual Studio en die met veel controls op 1 form werken:
Als je onder View -> Other Windows -> Document Outline kijkt dan krijg je een overzicht van hoe de controls op je Form staan. Kan erg handig zijn om een specifiek control er uit te lichten of anders te docken etc.

Any sufficiently advanced technology is equivalent to magic.


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
TeeDee schreef op donderdag 28 februari 2008 @ 16:43:
Dat zou heel goed mogelijk zijn, maar hou jij daar rekening mee?
Het is toch niet meer dan logisch dat de designer een control toevoegt aan de control waar je 'em op sleept? Ik check altijd of een control op de juiste plek terecht is gekomen, simpelweg omdat je dit soort gedrag krijgt als je niet oplet. Kwestie van secuur werken. Het kost meer tijd als je een uur later uit moet vogelen waarom die layout er toch zo kut uitziet.
Zyphrax schreef op donderdag 28 februari 2008 @ 17:25:
Dit is een probleem dat ik ook veel tegenkom. Je ziet het ook wel als mensen zelfs Wizards willen maken, waarvoor helaas ook geen standaard .NET control voor is. CodeProject heeft daar een paar aardige implementaties voor.
Het is niet enorm ingewikkeld. Ik heb voor een projectje waar ik nu aan werk een PageContainer control welke Page controls (configureerbaar aantal) laadt, en dan aan de hand van het paginanummer de juiste op visible zet.

[ Voor 4% gewijzigd door Hydra op 28-02-2008 18:04 ]

https://niels.nu


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Hydra schreef op donderdag 28 februari 2008 @ 18:04:
[...]
Het is toch niet meer dan logisch dat de designer een control toevoegt aan de control waar je 'em op sleept? Ik check altijd of een control op de juiste plek terecht is gekomen, simpelweg omdat je dit soort gedrag krijgt als je niet oplet. Kwestie van secuur werken. Het kost meer tijd als je een uur later uit moet vogelen waarom die layout er toch zo kut uitziet.
Zoals ik al zei: mijn ervaring met Winforms is dermate laag dat ik nog niet zover ben. De tooltjes die ik bouw zijn meer om zaken te leren dan dat het er leuk uitziet.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
TeeDee schreef op donderdag 28 februari 2008 @ 19:02:
[...]

Zoals ik al zei: mijn ervaring met Winforms is dermate laag dat ik nog niet zover ben. De tooltjes die ik bouw zijn meer om zaken te leren dan dat het er leuk uitziet.
Juist dat kan je dus perfect zien in de Document Outline.
Zie mijn eerdere reactie.

Any sufficiently advanced technology is equivalent to magic.


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Zyphrax schreef op donderdag 28 februari 2008 @ 19:32:
[...]

Juist dat kan je dus perfect zien in de Document Outline.
Zie mijn eerdere reactie.
Dat is inderdaad een handig overzicht. In VS 2008 is het trouwens direct onder View te vinden.

Kater? Eerst water, de rest komt later


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
TeeDee schreef op donderdag 28 februari 2008 @ 17:03:
[...]

Set Appearance to Buttons.
Set SizeMode to Fixed.
Set ItemSize to (0,1)
Dat werkt dus wel, alleen is er nu een grijze rand te zien:
Afbeeldingslocatie: http://tweakers.net/ext/f/9Tgw32vTFlchMHXNjX2YJkak/full.png
Het lukt me niet om die weg te krijgen, gespeeld met ItemSize, maar dat moet idd op (0,1) blijven staan,
Margin en Padding lijkt niks te doen.

Kater? Eerst water, de rest komt later


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

En als je (mijn laatste edit geloof ik) het e.e.a in een flowlayout panel gooit? Dan kan je zoveel panels erin slepen als je wilt, maar deze zullen geen parent / child van elkaar worden, maar van het flowlayout panel.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Topicstarter
Panels in een flowlayout gooien is inderdaad de simpelste oplossing en geen gezeur met tabPages slopen en rare grijze randen of :P

(al is de manier van Niemand_Anders waarschijnlijk wel het mooist, maar het gaat hier alleen maar om een simpel tooltje voor intern gebruik)

Kater? Eerst water, de rest komt later

Pagina: 1