[C#] Gebruik van struct hier handig, of een betere manier?

Pagina: 1
Acties:

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
C#.NET 2.0
Ik heb twee gui-tabellen ActivityTable, wat een zichtbare tabel is in de GUI.

Nu wil ik bij het klikken op zo'n tabel bewerkstelligen dat bijgehouden wordt welke tabel het laatst geklikt is, en hij moet een aantal acties uitvoeren bij het klikken. Tevens moet de SelectedRow veranderd kunnen worden, maar dit vereist in dit object een aantal handelingen.

Nu heb ik als oplossing bedacht een Struct te maken, zodat het allemaal automatisch gaat.

C#:
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
CurrentActivityTableStruct CurrentActivityTable;

public struct CurrentActivityTableStruct
{
    static ActivityTable _table = null;
    static int? _selectedrow = -1;

    public ActivityTable Name
    {
        get { return _table; }
        set {
            if (_table != null)
            {
                _table.ClearSelection(); // Clear Selection of previous table
            }
                _table = value; // Set new table
        }
    }

    public int? SelectedRow
    {
        get
        {
            return _selectedrow;
        }
        set
        {
            if (_table != null)
            {
                _selectedrow = value;
                if (value == null)
                {
                    _table.ClearSelection();
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("Name of current table :" + _table.Name + " Index: " + (int)value);
                    _table.CurrentRow = (int)value;
                    _table.SetSelected((int)value, true);
                }
            }
        }
    }
}



C#:
1
2
3
4
5
6
// Nu kun je de huidige tabel dus aangeven met:
CurrentActivityTable.Name = activityTableGeplandeOrders; // dat is een instantie van het object
// Om een rij te selecteren:
CurrentActivityTable.SelectedRow = teSelecterenRij;
// Om geen rij te selecteren:
CurrentActivityTable.SelectedRow = null;


Is dit wel een goede oplossing of is een struct daar helemaal niet voor bedoeld? Wie weet een betere oplossing?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Normaal gesproken wordt een struct als POD gebruikt en een class als er ook member functies ( constructor ) worde geimplementeerd.

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.


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Hoe zou ik het moeten doen zoals gebruikelijk is?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:34

mulder

ik spuug op het trottoir

Kan niet echt opmaken wat je nu wilt, maar dit lijkt me al iets logischer:
C#:
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
public class ActivityTable : Table
{ 
    private int _selectedrow = -1; 

    public int SelectedRow 
    { 
        get 
        { 
            return _selectedrow; 
        } 
        set 
        { 
                _selectedrow = value; 
                if (value == null) 
                { 
                    this.ClearSelection(); 
                } 
                else 
                { 
                    System.Diagnostics.Debug.WriteLine("Name of current table :" + this.Name + " Index: " + (int)value); 
                    this.CurrentRow = (int)value; 
                    this.SetSelected((int)value, true); 
                } 
        } 
    } 
}


C#:
1
2
3
4
5
ActivityTable currentActivityTable = activityTableGeplandeOrders;
// Om een rij te selecteren: 
currentActivityTable.SelectedRow = teSelecterenRij; 
// Om geen rij te selecteren: 
currentActivityTable.SelectedRow = null;

oogjes open, snaveltjes dicht


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Structs zijn voor kleine types, zoals een complexnumber. Jouw struct heeft een reference naar een groter object, ik zou een class gebruiken. Verder is je static verkeerd, want die is niet thread safe (je init moet in de declaratie staan of je moet locken) en je code refereert naar de static alsof het een membervariable is, dat zou ik anders opschrijven, nl. met het type ervoor.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Een struct is eigenlijk gewoon een verzameling variabelen die je vaak samen gaat gebruiken, soms is het makkelijker om een object te maken in een apparte class, maar voor kleine projectjes is het best handig.

bijvoorbeeld de eigenschappen van een huisje, of persoon kun je zo snel en makkelijk altijd in 1 datatype pasten, ook in 3D bewerking om een special vertextype aan te duiden is het makkelijk om een struct te gebruiken, noem het artestieke vrijheid.

In jouw geval lijkt het me minder handig, de struct die je maakt zal maar 1 of 2 keer gemaakt worden tijdens de runtime van het programma een runtime is meer geschikt om bijvoorbeeld 10000x dezelfde verzameling van strings en integers bij elkaar te houden (bijvoorbeeld 10000 verschillende mensen waarvan je velden als naam, hoogte, breedte, geslacht e.d. van wilt onthouden)

~ Mijn prog blog!


  • EfBe
  • Registratie: Januari 2000
  • Niet online
therat10430 schreef op vrijdag 25 mei 2007 @ 23:31:
Een struct is eigenlijk gewoon een verzameling variabelen die je vaak samen gaat gebruiken, soms is het makkelijker om een object te maken in een apparte class, maar voor kleine projectjes is het best handig.
De grootte van je project heeft niets te maken met het wel of niet toepassen van een struct. Een struct is een valuetype en daarom al in veel gevallen niet gewenst. Immers: wanneer je een instance doorgeeft aan een method, dan is dat een copy en niet de feitelijke instance. In 99% van de gevallen is het dus onzinnig om een struct te gebruiken, TENZIJ de behavior van je struct feitelijk een valuetype is.
C#:
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
using System;
using System.Collections.Generic;
using System.Text;

namespace Tester
{
    public struct Foo
    {
        public int Val;
    }

    class Program
    {
        static void Main( string[] args )
        {
            Foo f = new Foo();
            f.Val=10;

            DoSomething(f);
            Console.WriteLine(f.Val);
        }

        private static void DoSomething(Foo f)
        {
            f.Val++;
        }
    }
}

(jaja, ik weet wat ref is, maar ref is niet altijd wenselijk want dan kun je ook een NIEUWE instance aanmaken en aan de var assignen, terwijl je dat nu juist veelal niet wilt)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1