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
Kim,
Det er meget mindre indviklet end du lægger op til.

1) du implemterer flere af de forskellige løsninger på 'problemet' jeg har foreslået, i stedet for at vælge én.

2)Jeg har sat class newTextbox parallel til class Form1
og tilføjet en property 'isCarried' til at bære info
Fold kodeboks ind/udCSharp kode 


3)Det er en fejl at lave klasser til begivenhederne. Vi kan gennemgå et setup med at engagere en event senere.

4)når du instantierer newTextBox :
NewTextBox newTextBox = new NewTextBox();
newTextBox+= addhandler mouseDown();// syntax??

5)Noget i denne retning skulle være ok. Ikke sikker på syntax eller om der kan være noget med mybase
void newTextBox_mouseDown(object sender, EventArgs e)
{
//mybase.mousedown(sender,e); ??
throw new NotImplementedException();
}


6) Du kan måske sætte en NewTextBox newTextBox = new NewTextBox(); i formen, vælge elementet og checke om kode-editoren selv sætter de nedarvede events på.

7)Uden visual editor taber du kun layout. du kan erstatte med 'for each' fordi din layout er 'nemt'. Lav et array/list og fyld:

NewTextBox beholder[];
for(i=0;i<6;i++){
NewTextBox t= new NewTextBox();
//addHandler hvis nødvendigt
//do t layout
beholder=t;//mail-editoren sluger noget tekst her
}//next i

8)igen .. check InitializeComponent() for inspiration til korrekt syntax.

//-------------------






Indlæg senest redigeret d. 08.03.2012 08:58 af Bruger #17086
Hej Carsten

Du må undskylde det rod til koder jeg lå op i sidste post. Må have været meget træt igår. Har stort set skrevet alle koderne om, for du har ret, jeg havde gjort det for overkomplekst. Har fået samlet det nu, så alt DragandDrop kan klares med kun tre eventhandlers (hvor jeg før havde en pr. textbox). Nu mangler jeg bare at bruge min currentindex og array. Håber på at kunne gennemskue det inden så længe.

Fold kodeboks ind/udCSharp kode 





Indlæg senest redigeret d. 08.03.2012 09:18 af Bruger #17108
Kim,
Du har overhalet mig. Jeg kan ikke lære dig noget.

Jeg tror du har strukturen, men har ikke sat de tests på som accepterer eller forkaster operationen. Jeg ville give class newTexbox en property 'boolean hasBeenMovedOnce'

Som jeg forstår din kode, så:
Fold kodeboks ind/udCSharp kode 


Der bliver noget med at sætte EventArgs e.CurrentTextBoxIndex=i

for (int i = 4; i < 7; i++)
{
tb = new NewTextBox();
tb.Size = new System.Drawing.Size(50, 20);
???



Den kan jeg ikke lige gennemskue.
//edit
Min erfaring rækker nok til at sætte ny event ..
event myDrop(TextBox sender,EventArgs g)
og kalde eventen (i form1 ) med
throw myDrop(myTexbox,SomeArgs)

Det er det eneste setup hvor jeg har haft adgang til selv at sætte 'SomeArgs'.

I det lys får throw myDrop() en helt anden karakter, altså hvis den skal fyres af i for-loopet hvor du instantierer TextBox'ene.

Hvis det kan omgås (altså at få form1 til at anerkende og reagere på din nye eventArg) kender jeg ikke metoden




Indlæg senest redigeret d. 08.03.2012 10:36 af Bruger #17086
Hej Carsten

Synes godt nok det er svært at få ført videre til DragDrop hvilken textbox man startede drag'et fra. Prøver de ting du har skrevet i sidste post. Det skal nok lykkes :)

------------------------------------
Edit:

Endelig!. Men det endte med jeg fik hovedpine til sidst, så opgav at finde ud af hvordan jeg kunne bruge min egen klasse med en ny event til at løse problemet. I stedet lavede jeg en int CurrentTextBoxIndex, der får oplyst hvilken TextBoxArrayIndex der er TextBoxSource (gennem en GiveFeedback event). CurrentTextBoxIndex bliver så kun brugt hvis der sker et drop gennem dragDrop vha. tb[CurrentTextBoxIndex].Enabled = false.

Ikke den kønneste løsning. Men behøver en pause fra events, før jeg graver ned i det igen.

Tusind Tak for hjælper. Har lært en masse denne gang, føler jeg har fået langt mere styr på hvordan jeg laver events nu og hvad "sender" og "e" er for nogle størrelser. Inden dette har de altid være lidt af et mysterium for mig.

Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 08.03.2012 12:26 af Bruger #17108
Kim,
Jeg håber du er i det for at lære, så du ikke spilder tiden med løsninger der minder om unødvendige omveje. Det har været en fornøjelse (om ikke altid en hjælp)



<< < 12 > >>
t