06. januar 2013 - 16:17Der er
17 kommentarer og 1 løsning
Problemer med contextMenu og object sender
Jeg er en glad selvlært programmør, som i mange år har brugt VB6. Nu er det så tid til at benytte C#. Stejl omlæringskurve :)
Så jeg har 52 labels i main form på en Windows Form Application (label1, label2, label3 etc.)som jeg fylder med navne. Hver label er koblet til den samme contextMenu med et antal valgmuligheder (f.eks. Fri, Til stede, Ferie). Nu vil jeg gerne have at jeg kan højreklikke på en label og via den ændre en værdi i et tilhørende array (jeg har f.eks. oprettet public static string[] statusFarve = new string[53];).
private void friToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; this.textBox1.Text = tsmi.Text; //textBox1 er til testformål }
giver mig desværre kun teksten fra menupunktet (her "Fri"), og jeg har brug for enten at referere til label[index].Text eller til selve index og en metode til at sætte statusFarve[index]="0".
Fri skal sætte værdien til "0", Til stede = "2" og Fri = "3".
Med normalord, så skal et klik på contextMenuItempunktet "Fri" i label1 sætte en variabel statusFarve1 til værdien "0". label15 skal sætte værdien i statusFarve15.
og et klik på contextMenuItempunktet "Til stede" i label1 sætte en variabel statusFarve1 til værdien "1". label15 skal sætte værdien i statusFarve15.
Og det nytter desværre ikke at være meget generel. Jeg lærer desværre bedst med et eksempel fyldt med data, som jeg kender.
Jeg har tumlet med dette problem i lang tid nu, og jeg har stadig ikke fattet de eksempler jeg kan finde på nettet og heller ikke fra bogen af Andrew Troelsen: Pro C# 2008 and the .NET 3.5 Platform", som jeg købte netop for at lære og forstå via en dygtig lærer. Jeg er bange for at mine mange år med VB6 har sat sine spor og jeg har ganske svært ved at omstille mig.
Jeg har lavet mine labels og trukket en ContextMenuStrip ind i min form. Her har jeg så lavet x antal menupunkter. Når jeg dobbeltklikker på menupunktet "fri", får jeg en private void friToolstripMenuItem_Click(object sender EventArgs e)
Når jeg indsætter din kode i den får jeg den omtalte fejl.
Når jeg opretter en testform med dette ene formål for at test ser den således ud
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace menutest { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void friToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem item = sender as ToolStripMenuItem; if (item != null) { int index = (item.OwnerItem as ToolStripMenuItem).DropDownItems.IndexOf(item); this.textBox1.Text = index.ToString(); } }
Man kan vælge at markere et indlæg som henholdsvis en kommentar (default) eller et svar. Kun svar kan tildeles point.
De fleste 'gamle' brugere vælger at nøjes med kommentarer, indtil det viser sig, om spørger kunne bruge ens bidrag til noget. Er det tilfældet - eller hvis en bruger har svedt godt med forsøg på hjælp - er det kotume, at spørger beder den eller de pågældende bruger(e) lægge et svar, så point kan fordeles.
Jeg har ikke samlet point de seneste par år, så det bliver ikke denne gang, du får lov at prøve det. I stedet lægger du selv et svar og accepterer det, hvorved tråden lukkes =)
Jeg holder lige kysset. I min begejstring (ikke at dit svar ikke er brugbart), så fik jeg lige overset at jeg ganske rigtigt får et index, men det er index på menupunkterne. Jeg skulle helst have nummeret på den label, der benytter contextMenuen når den kaldes.
Altså om det er label1 eller label 2 eller 15, der kalder menuen.
Og da du har gjort dig den ulejlighed at tænke videre på mit problem, og ovenikøbet ser ud til at have løst det, så er du da velkommen til at betragte kysset som afsendt. Du kan afhente det i CyberSpace. Hvordan du får det videre ind i MeatSpace véd jeg ikke.
private void test1ToolStripMenuItem_Click(object sender, EventArgs e) { // Tak til olebole fra Eksperten.dk for hjælpen ToolStripMenuItem item = sender as ToolStripMenuItem;
if (item != null) { // LabelIndex sættes med Substring så jeg får // labelnummer separeret ud int LabelIndex = Convert.ToInt32(item.Owner.Tag.ToString().Substring(5));
// timer1LoadStatusFile disables, så jeg ikke skriver //og læser fra statusfilen på samme tid. timer1LoadStatusFile.Enabled = false;
// Sæt den relevante globale vaariabel MINUS 1, da array starter på 0 //og labels starter på 1 Module1.hvilkenAfdeling[LabelIndex - 1] = "1";
// I writeStatusfile genstartes timer1LoadStatusFile efter at filen er lukket writeStatusFile();
// alle label populeres med opdatererede oplysninger LoadNameBoxes(); } }
Synes godt om
Ny brugerNybegynder
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.