Jag har tillbringat den senaste vecken med att söka efter svar på internet men ingenting har lyckats. Låter som det du beskriver är att usercontrolen ska kunna skicka ett event till sin host(?) Hej Tomas och tack för ditt svar. Jag har fösökt att förstå och att test... Miss av mig (har inte möjlighet att testköra själv, så jag kör på gehör)... Tack Tomas, inga error men ingenting skrivs till toolStripStatusLabel2.Text.Skicka värden från usercontroll till form
Jag har en userkontroll med ett antal comboboxar. Jag vill skicka resultatet till min form, eg toolStripStatusLabel2.Text som finns i formen.
<code>
//i usercontrollen
private void cmbOrginal_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbOrginal.Text.Length != 0 || listView1.Items.Count > 1)
{
toolStatusText2= cmbOrginal.Text;
//osv
//property
public string ToolStatusText2
{
get
{
return cmbOrginal.Text;
}
set
{
toolStatusText2 =value;
}
}
// i form frmTranspose
public string ToolStatusText2
{
get
{
return transposer1.ToolStatusText2;
}
set
{
toolStripStatusLabel2.Text = value;
}
}
</code>
Jag får inga som helst error, men jag lyckas inte heller att överföra några värden.
Tips och råd tas tacksamt imot.Sv: Skicka värden från usercontroll till form
Se t.ex. http://ondotnet.com/pub/a/dotnet/2002/04/15/events.html
I ditt fall nåt i stil med följande:
/* i usercontrol */
public delegate void SelectedItemChanged(object sender, EventArgs e);
private void cmbOrginal_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbOrginal.Text.Length != 0 || listView1.Items.Count > 1)
{
ToolStatusText2 = cmbOrginal.Text;
if (SelectedItemChanged != null)
{
SelectedItemChanged(this, EventArgs.Empty);
}
}
}
public string ToolStatusText2 { get; set; }
/* i klassen som hostar usercontrol-instansen */
public frmTranspose ()
{
this.transposer1.SelectedItemChanged += transposer_change;
}
private void transposer_change(object sender, EventArgs e)
{
toolstripStatusLabel2.Text = this.transposer1.ToolStatusText2;
}
Sv:Skicka värden från usercontroll till form
Först, eftersom det rör sig om flera comboboxar så utgår jag ifrån att det måste vara en delegat för varje combobox, så jag bytte namn till <b>cmbOrginalSelectedItemChanged</b>
Jag får därimot ett problem(error)
<code>
MusicTranspose_3.Transposer.cmbOrginalSelectedItemChanged' is a 'type' but is used like a 'variable'
//classen ser ut så här nu
private void cmbOrginal_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbOrginal.Text.Length != 0 || listView1.Items.Count > 1)
{
toolStatusText2 = cmbOrginal.Text;
if (cmbOrginalSelectedItemChanged != null)
{
cmbOrginalSelectedItemChanged(this, EventArgs.Empty);
}
cmbNydur.Enabled = true;
cmbNydur.Focus();
}
//sen kommer en else-sats men det spelar nog ingen roll här nu.
</code>
Jag försöker att läsa och förstå den länken du skickade med, men än så har det inte hjälpt mig, trögfattad???Sv: Skicka värden från usercontroll till form
<code>
//om jag gör så här
cmbOrginalSelectedItemChanged selectedItem = new cmbOrginalSelectedItemChanged();
toolStatusText2 = cmbOrginal.Text;
if (selectedItem != null)
{
selectedItem(this, EventArgs.Empty);
}
// så har jag BARA ett error kvar:
MusicTranspose_3.Transposer.cmbOrginalSelectedItemChanged' does not contain a constructor that takes 0 arguments
</code>
.. och då är frågan, vad göra?Sv: Skicka värden från usercontroll till form
// i nåt lämpligt namespace, t.ex. i usercontrolen
// Denna rad säger i princip "Om en metod returnerar void och tar 2 argument av typerna object respektive EventArgs) så kan vi för enkelhetens skull kalla den arten av metoder för cmbOrginalSelectedItemChangedHandler".
public delegate void cmbOrginalSelectedItemChangedHandler(object sender, EventArgs e);
// i usercontrolen
// Denna rad säger att "Ibland ska den här klassen kunna kräkas ur sig ett event. För att någon ska kunna hantera ett sådant event måste eventhanteraren uppfylla de villkor som gäller för en cmbOrginalSelectedItemChangedHandler (se ovan).
public event cmbOrginalSelectedItemChangedHandler cmbOrginalSelectedItemChanged;
private void cmbOrginal_SelectedIndexChanged(object sender, EventArgs e)
{
/*...*/
// Här triggas eventen. Om någon eventhandler (kan vara 0, 1 eller flera) har registrerat sig så kommer de kicka igång nu.
cmbOrginalSelectedItemChanged(this, EventArgs.Empty);
/*...*/
Sv:Skicka värden från usercontroll till form
Skall verkligen propertyn se ut så här:
<code>
public string ToolStatusText2 { get; set; }
</code>
..kan det vara det som är galet?
Jag ändrade till
<code>
public string ToolStatusText2
{
get
{
return toolStatusText2;
}
set
{
toolStatusText2 = value;
}
}
</code>
Nu fungerar det, men jag har nog orsak att komma tillbaka.
Jag lyfter på hatten för dig, tack Tomas