Hjælp til drag and drop (c#)

Tags:    c# drag-drop winforms

<< < 12 > >>
Hej

Jeg er både ny til den hjemmeside og til programmering, så bær over med mig hvis jeg ikke gør tingene helt efter bogen.

Er igang med at implementere Drag and Drop i et lille program jeg har gang i. Jeg har opstillet 2 rækker af 5 textboxe. Det er meningen at jeg skal kunne kopier en værdi fra en textbox fra den en række til en textbox i de anden række. Den del har jeg fået til at virke.
Men samtidigt vil jeg gerne, at hvis der sker et drop, at den textbox som er datasource bliver disabled. Eller på anden måde at man ikke kan trække en værdi fra den igen.

Kunne forestille mig at det skulle ske i eventhandler DragDrop, men ved ikke hvordan jeg programmerer det til datasources (har rodet med e)

Fold kodeboks ind/udCSharp kode 





15 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
textBox1 er osse præsenteret i argumentet -object sender-. Du kan tilgå den med .. noget i retningen af:

textbox tx; // husker ikke den korrekte type for textbox

tx=cType(textbox, sender);// kommer argumenterne i den rigtige rækkfølge?

Ideén er at du typecaster en variabel (tx) til typen textbox og sætter den = sender;

Så kan du: tx.disable=true; // eller hvad nu den korrekte formulering skal være.



Tror måske det fik mig lidt på rette vej. Mit problem er at jeg ikke grundlæggende ved hvad "sender" og "e", da man helt klar skal bruge dem her.

Prøvede det du skrev. cType er dog VB, men det kan skrives sådan her i c#.

Fold kodeboks ind/udCSharp kode 


Problemet er bare at det kun deaktivere den textbox jeg smider værdien i og ikke den textbox jeg henter værdien fra. Det jeg prøver at lave er at en datasource kun kan bruges en gang (hvis det giver mening).



Der er for lidt af din kode til at jeg kan se, hvad der er galt. Er der ikke involveret flere events i hele processen .. altså osse én der har kontakt med den første textbox (som startDrag())? Jeg er for doven til selv at kigge efter, hvordan drag/drop koderne ser ud.

Der vil sikkert ikke være en textbox.enable=false; som forhindre drag/drop, men du skal så lave noget if() for at styre hvad der må og må ikke ske.



Indlæg senest redigeret d. 06.03.2012 16:19 af Bruger #17086
Ja du har ret. Beskrivelsen er lidt tynd. Smider lige et billede op og koderne.

http://i40.tinypic.com/15d6ywn.jpg


Fold kodeboks ind/udCSharp kode 





hm .. du har én _DragEnter. Hvad med én _mouseDown og én _DragDrop?
Eller enherit en klasse fra textBox og tilføje en boolean property "HasBeenPicked".
Eller giv de 7 textboxes hver en boolean og sæt den første gang så den er falsk næstegang du kommer. Det vil måske være nemmere at bruge clipboard direkte ... men det vil jeg overlade til dig selv at finde ud af.

//edit
Jeg fatter ikke at du kan skrive en kompleks klasse som DiceRoller, og bruge den ... os så gå kløjs i et nemt problem



Indlæg senest redigeret d. 06.03.2012 20:47 af Bruger #17086
Det er simpelt og som jeg skrev i min anden post. Mit problem er at jeg ikke grundlæggende ved hvad "sender" og "e". Har generelt problemer med Eventhandlers.

Linq, Entity syntax og method syntax (måske ikke lige lambda expressions :-) ), classes, methods osv. Synes jeg er legede let.

Prøver lige i morgen at se om jeg kan finde ud af det. Ellers må jeg finde noget litteratur, så jeg kan få det på plads.



Problemet med at forstå events er ikke noget du kan løse overnight. Du har lige set hvad 'sender' er. Hvad er problemet? Sender er ikke en type, men /den/ type du arbejder med ... events kan hookes op på mange forskellige objekt-typer. systemargs eller mouseargs bærer oplysninger om begivenheden. Jeg skriver ikke din kode .. glem det.
Jeg kan godt se, at der ikke er noget i sender eller e du kan bruge i din kode. Er elementerne genereret med en visual toolbox? .. Det er hurtigt; men du mangler arrayet af textBoxes at referere til så du kan tilgå den valgte textbox igennem txtBoxArray(currentIndex). Og så skal du osse selv koble eventHandlerne på ... hvis ikke du vil gå lige til clipboardet.
Måske kan du lave fx en textbox.mousedown event der dækker alle, hvor du så finder den akuelle box gennem 'sender'
ok, nemt og nemt ..
Den flotte løsning vil være at lave en ny textbox klasse og bygge eventen ind, men det kan du ikke endnu. De events du har til rådighed er parent/child-orienteret. Den event du vil dække går på tværs child/child.

Måske skal du glemme 'visual toolbox'

//edit// Du kan i stedet skrive direkte: clipboard.text= 'my value'
Og modsat når der bliver droppet. Måske kan du få det til at virke, hvis du kan nøjes med et string-udtryk for textboxBase (clipboard.text= 'my value'&'textbox_3'.



Indlæg senest redigeret d. 07.03.2012 08:01 af Bruger #17086
Det var nu heller ikke det jeg mente. Det er de færreste ting i c# jeg har lært på en dag, men man begynder at få en ide om hvordan tingene hænger sammen. Der har masser jeg mangler at finde ud af endnu, startede kun for små 3 måneder siden (selvlæring). Men er bleven vildt bidt af det. Ville ønske jeg kunne lave min uddannelse om og arbejde med et i stedet :)

Du må endelig ikke tro jeg er interesseret i at du skriver mine koder, jeg leder kun en clues om den retning jeg bør bevæge mig ud i. Så hvad du gør er skide godt.

Alle min tools er fra visual studio toolbox. Skide smart med en textbox-arrays, troede faktisk ikke det kunne gøres sådan. Vil jeg prøve at følge op på.

Må sige, da jeg stillede spørgsmålet om hvordan mit problem kunne løses, troede jeg ikke det ville blive så omfattende.



Må sige, da jeg stillede spørgsmålet om hvordan mit problem kunne løses, troede jeg ikke det ville blive så omfattende.


Ja, det er ikke altid til at forudse, hvilke problemer der gir knuder.

Jeg mangler stadigvæk et array .. måske et array[] med 0 eller 1 værdi for true/false . Og så en currentBaseIndex
Så kan du beholde auto-koden, sætte currentBaseIndex og array[currentBaseIndex]=0 ved start og
array[currentBaseIndex]=1 ved successfuld drop (hvor du checker at værdien ikke allerede er 'sat'
Fold kodeboks ind/udCSharp kode 


Hvis du vil tilbage til textboxen og ændre den så får nødig at holde styr på, hvilken textbox ´2´er .. allerede nu kan der være rod med indices.

//edit//Hvis du følger InitializeComponents() kan du måske finde ud af, hvilke indices yourForm.control.controls giver de forskellige textboxe. Brug dem, så kan du gå tilbage på den måde.



Indlæg senest redigeret d. 07.03.2012 09:43 af Bruger #17086
Har prøvet at arbejder med at lave min egen textbox klasse og bygge eventen ind. Indtil videre har jeg sat eventen til at kunne overføre en int der kan repræsentere indexet i textbox arrayet. Men mangler stadig at kunne programmere DragDrop og MouseDown til at virke for den benyttede textbox. Kunne godt bruge et hint her.

Du kan se mine foreløbige koder her:

Fold kodeboks ind/udCSharp kode 




<< < 12 > >>
t