Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 10:27 Der er 25 kommentarer og
2 løsninger

aarggh.. drag drop virker ikke

Jeg har to listbokse:

listbox_1 = listBox_subcategory
listbox_2 = listBox_add_subcategory

Der skal kopieres fra listbox_1 til listbox_2

Begge listbokse indeholder objects (klasser jeg selv har smidt i dem)

Mit problem er kort sagt at jeg ikke kan få det til at fungere. Det har tidligere virket, men det er længe siden jeg sidst har arbejdet med projektet og efter at have ændret en del hist og her virker det ikke mere.

Her er koden som jeg har forenklet lidt. Jeg har AllowDrop=true på begge listbokse

private void listBox_subcategory_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(listBox_subcategory.Items.Count != 0)
{
  cls_SubCategory c_subcategory    = (cls_SubCategory) listBox_subcategory.SelectedItem;
  DragDropEffects dde1 = DoDragDrop(c_subcategory,DragDropEffects.Copy);
}
}

private void listBox_add_subcategory_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
listBox_add_subcategory.Items.Add(e.Data);
}
Avatar billede anadan Nybegynder
11. august 2005 - 10:45 #1
Der er et fremragende eksempel med 2 ListBox her : http://www.codeproject.com/cs/combobox/LarryDragAndDrop.asp
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 11:10 #2
yes det er et fint eksempel, men jeg kan for så vidt godt drag/droppe men efter første drag/drop hænger koden. Det er som om forløbet ikke afsluttes.

I min listBox_subcategory_MouseDown metode starter jeg med at hente et objekt af typen cls_SubCategory

cls_SubCategory c_subcategory = (cls_SubCategory) listBox_subcategory.SelectedItem;

Herefter sætter jeg nogle textbox'e:

textbox_navn = c_subcategory.Navn;
textbox_alder = c_subcategory.Alder;

MEN DETTE SKER KUN FØRSTE GANG JEG KØRER METODEN.....!

Jeg ved ikke hvad der går galt undervejs, men der er ingen fejl i mine try/catch
Avatar billede anadan Nybegynder
11. august 2005 - 11:15 #3
Kunne det være et problem med at du henter data direkte fra din ListBox, istedet for at bruge e.Data?

        private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            MessageBox.Show(e.Data.ToString());
        }

        private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.All);
        }
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 11:20 #4
jeg havde bare forenklet koden lidt.. ovenstående virkede mht dragdrop

her er hvad jeg gør pt:

private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
  MessageBox.Show(e.Data.GetData(DataFormats.StringFormat).ToString());
}

private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
  listBox1.DoDragDrop(c_subcategory.Id.ToString(), DragDropEffects.Copy );
}

Jeg får tilføjet det rigtige ID men når jeg anden gang vælger et andet ID viser den første id igen.. og såden bliver det ved.
Avatar billede anadan Nybegynder
11. august 2005 - 11:41 #5
Prøv at sende din kode, så kigger jeg lige på det
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 11:56 #6
min kode er meget omfattende, så jeg kan ikke bare poste den da der er for mange funktioner som spiller ind. Jeg har dog udkommenteret alt og kører stort set kun det jeg har postet her.. men du kan måske bare hjælpe med følgede spørgsmål - du skal nok få points for det hvis du kan hjælpe med det :)

i alle eksempler jeg har set står der:

e.Data.GetData(DataFormats.StringFormat).ToString()

jeg vil gerne gøre noget i retning af:

private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
  listBox1.DoDragDrop(c_subcategory, DragDropEffects.Copy );
}

private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
//Denne cast er ikke tilladt, men hvordan får jeg overført min klasse
cls_SubCategory c_subcategory = (cls_SubCategory) e.Data;
}
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 12:03 #7
hvis jeg skal beskrive mit problem meget kort må det være at min DragDrop rutine ikke afsluttes, så jeg kan køre den igen.
Avatar billede anadan Nybegynder
11. august 2005 - 12:09 #8
Problemet ligger i dit data format. Data formatet skal matche din klasse. Jeg har her lavet min egen klasse (MyClass) der tager et argument (word). Derefter bruger jeg dataformatet typeof(MyClass) ved modtagelse. ved en MouseDown bliver en ny instans af MyClass bare sendt med (her skal der self. ske noget andet)

        private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            MessageBox.Show(((MyClass)e.Data.GetData(typeof(MyClass))).name);
        }

        private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            this.listBox1.DoDragDrop(new MyClass("Hello"), DragDropEffects.All);
        }
        private void listBox2_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }
        private class MyClass{
            public MyClass(string word)
            {
                this.word = word;
            }
            public string word;
        }

    }
Avatar billede anadan Nybegynder
11. august 2005 - 12:10 #9
whops fejl, ved DragDrop skal det være .word, ikke .name
Avatar billede anadan Nybegynder
11. august 2005 - 12:11 #10
Den kommer lige igen

        private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            MessageBox.Show(((MyClass)e.Data.GetData(typeof(MyClass))).word);
        }

        private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            this.listBox1.DoDragDrop(new MyClass("Hello"), DragDropEffects.All);
        }
        private void listBox2_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }
        private class MyClass{
            public MyClass(string word)
            {
                this.word = word;
            }
            public string word;
        }
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 12:23 #11
YES.. det virker med typeof(minklasse)

Det eneste problem er nu at jeg kun kan udføre operationen én gang

Her er min kode:

private void listBox_subcategory_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
try
{
if(listBox_subcategory.Items.Count != 0)
{                   
cls_SubCategory c_subcategory = (cls_SubCategory) listBox_subcategory.SelectedItem;
textBox_subcategory_name.Text        = c_subcategory.Name;
textBox_subcategory_sort.Text        = c_subcategory.Sort.ToString();
checkBox_subcategory_active.Checked    = c_subcategory.Active;

if(listBox_subcategory.Items.Count != 0)
{
DragDropEffects dde1 = listBox_subcategory.DoDragDrop(c_subcategory, DragDropEffects.Move );
}
}
}
catch(Exception x)
{
this.WriteLog("listBox_subcategory_MouseDown: " + x.ToString());
}
}

private void listBox_add_subcategory_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
try
{
if( e.Data.GetDataPresent(typeof(cls_SubCategory)) )
{
cls_Category c_category = (cls_Category) listBox_add_category.SelectedItem;
cls_SubCategory c_subcategory = (cls_SubCategory) e.Data.GetData(typeof(cls_SubCategory));
c_subcategory.CategoryId = c_category.Id;
c_startcontroller.SystemController.SubCategoryContainer.AddSubCategoryToCategory(c_subcategory.Id, c_category.Id);
GetRelatedSubCategory( c_category.Id );
}
}
catch(Exception x)
{
WriteLog("listBox_add_subcategory_DragDrop" + x.ToString());
}
}
private void listBox_add_subcategory_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
Avatar billede anadan Nybegynder
11. august 2005 - 12:26 #12
kun én gang? hvad sker der anden gang? prøv at lave noget debugging og se hvor det går galt
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 12:30 #13
Jeg kan godt lave den flere gange med det er samme objekt jeg flytter med selvom jeg vælger en anden, så det er som om systemet ikke fatter at jeg er færdig med den tidligere D&D. Jeg laver en c# applet som kører i en webbrowser så det er ikke let at debugge, men jeg laver logfiler på alt og det tyder ikke på fejl nogen steder.. jeg checker lige en ekstra gang eller fem.

Skal der noget bestemt til før en drag-drop-operation er fuldført? Det er som om systemet ikke fatter at operationen er slut.

Vender tilbage asap.
Avatar billede Syska Mester
11. august 2005 - 13:25 #14
lytter lige med, er selv ved at kigge på D&D :-)

// ouT
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 13:26 #15
jeg kan ikke finde fejl :( fortsætter senere... men der er selvfølgelig points til dig anadan
Avatar billede anadan Nybegynder
11. august 2005 - 13:28 #16
sweet :) bare giv mig halvdelen eller noget, der mangler jo stadig noget i en fuld løsning...
Avatar billede anadan Nybegynder
11. august 2005 - 13:28 #17
jeg kigger lige på det senere, og kommer tilbage hvis jeg finder et svar
Avatar billede Syska Mester
11. august 2005 - 14:25 #18
Lige for at bryde ind....

Hvis man laver 2 listbox's, og man vil lave sådan at man mover items mellem dem, skal man så selv sørge for at slette dem i den oprindelige eller er der en smart måde til det?

// ouT
Avatar billede anadan Nybegynder
11. august 2005 - 14:27 #19
buzzzz : Det skal du selv gøre, se eksempel på http://www.codeproject.com/cs/combobox/LarryDragAndDrop.asp (nævnt ovenfor)
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 14:27 #20
listBox_add_category.SelectedItem ændres aldrig.. selvom denb gør det rent grafisk.. men udskriver jeg SelectedItem er det altid den jeg valgte først som udskrives :(

buzzz> du skal selv lave det som skal ske i forbindelse med drag drop så vidt jeg ved
Avatar billede Syska Mester
11. august 2005 - 14:30 #21
skulle bare lige være sikker på at der ikke kunne laves noget smart i forbindelse med at man valgte at det skulle være en Move, hvad ved jeg.....

Kan sagtens få D&D til at virke.... vil prøve senere med et TreeView, det kunne være nice :-)

// ouT
Avatar billede anadan Nybegynder
11. august 2005 - 14:33 #22
Nej en Effect bruges fordi brugeren kan holde CTRL/SHIFT eller whatever nede, hvilket så genererer en Effect (Copy/Move) ligesom i ex. windows stifinder
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 15:00 #23
YEEEEEEEEEEEEEEEEEEEEEEES

Halleluja Gud er god....

sådan her skulle det gøres:

int indexOfItem = listBox_subcategory.IndexFromPoint(e.X, e.Y);
cls_SubCategory c_subcategory = (cls_SubCategory) listBox_subcategory.Items[indexOfItem];

Nu virg'årt
Avatar billede Syska Mester
11. august 2005 - 17:07 #24
hehe, kunne jeg godt have forklaret dig, men troede det virkede på en anden måde da du skrev det lave en hjemmeside :-S

Men jeg er da glad for at du også har fået det til virke..

// ouT
Avatar billede Lars Søndergaard Nybegynder
11. august 2005 - 17:09 #25
:)
Avatar billede Syska Mester
11. august 2005 - 21:59 #26
heheh, har fundet en fejl...

På en treeview, i DragDrop eventen, bliver der returnet forkerte kordinater, man får kordinater på musen fra venstre top hjørne på ens skærm og ikke på ens treeview control, altså man skal til at trække top left fra på formen, og så fra controllen ud til formen....nedern.... :-(

// ouT
Avatar billede Syska Mester
11. august 2005 - 22:00 #27
håber i forstår :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester