c # - Forhindrer brugeren at klikke på en bestemt knap, når en handling udføres

Indlæg af Hanne Mølgaard Plasc

Problem



Her er scenariet:

Platform: Windows

IDE: Microsoft Visual Studio 2008

Sprog: C #

.NET framework: 3.5



Min ansøgning indeholder 2 buttons - 'Load Data' og 'Stop Loading Data' og en multi-line textbox. Ved at klikke på 'Indlæse data' button begynder nogle data at blive indlæst i textbox. For at forhindre at brugeren klikker på 'Load Data' button flere gange, har jeg deaktiveret button, når den er klikket. Når hele data hentes i textbox, aktiveres 'Load Data' button igen. På den anden side ved at klikke på 'Stop Loading Data' button stoppes indlæsningen af ​​data (hvis brugeren ønsker at stoppe det, før hele indholdet læses).

Som tidligere nævnt forhindrer brugeren at klikke på 'Load Data' button flere gange, har jeg deaktiveret button med den hensigt at brugeren kun kan klikke på 'Stop Loading Data' button]] ellers vent på, at hele data skal indlæses i textbox. Jeg implementerede dette. Ved første øjekast syntes det at fungere godt. Men under testen fandt jeg ud af, at 'Load Data' button er deaktiveret, hvis brugeren klikker på button, selvom der ikke sker noget på det pågældende tidspunkt, men så snart hele data bliver lastet og button bliver aktiveret igen, det klik, der er foretaget under deaktiveret tilstand, viser sig at blive udført. Som om programmet optagede tastetryk og museklik og ventede på, at knappen blev aktiv igen. Men der er ingen sådanne tastetryk eller museklikoptagelsesfacilitet i mit program. Hvad forårsager en sådan aktivitet? Hvordan kan jeg forhindre sådan adfærd?


Tak.

Bedste reference


En mulighed ville være at arbejde med en reentrancy sentinel:


Du kan definere et int felt (initialiseres med 0) og opdatere det via Interlocked.Increment ved indtastning af metoden og fortsæt kun hvis det er 1. I slutningen skal du bare lave en Interlocked.Decrement. [25] [26]


For at gøre det synligt for brugeren kan du deaktivere knappen i starten af ​​udførelsen og aktivere den, når fuldførelsen er færdig ...


BTW: Løbende opgaver skal udføres async (via en separat tråd for eksempel) ...

Andre referencer 1


Hvis du laver dit opkald synkront, låser det hele siden op, indtil du læser færdiggørelsen.


Ellers vil du bare lave den metode, du allerede har prøvet, jeg vil gerne se din kode for handicappede, fordi noget fortæller mig, at du bare har gjort det tilsyneladende deaktiveret, og det var stadig en funktionsknap

Andre referencer 2


Tjek dette indlæg:


http://www.codeguru.com/forum/showthread.php?t=480279[27]


Min første tanke var at fjerne begivenhedshåndteringen og genoprette den i slutningen af ​​klikhændelsen. Denne tråd foreslår at bruge en BackgroundWorker og gøre det async.

Andre referencer 3


Jeg vedder på, at du ikke kan flytte formularen, før dataene er indlæst, og du kan heller ikke stoppe med at indlæse data. Problemet er, at hele formularen fryser, indtil læsningen er færdig. Du skal flytte lastdelen i separat tråd.

Andre referencer 4


Nå en anden silution igen:


På startbelastning gemmer du blot en load knap og i stedet for den (siger) viser en fremdriftslinje. Når du er færdig med indlæsningen eller på stop loading, klik på knappen load igen. I dette tilfælde undgår du 'kædeklik' -administration du klager over.


Eller administrer en -knap. Først er det load, på klik bliver i stedet stop load. Løsning på denne måde finder du ofte i mobilmiljø, i betragtning af det begrænsede skærmrum. Men jeg tror, ​​det kan anvendes til skrivebordet med stor succes også. Hvorfor ikke?