Zdravím, mám problém jak získat přístup k ovládacím prvkům v hlavním formuláři (frmMain) z dynamicky načetlého UserControlu (ucTest). Chtěl bych měnit vlastnosti (např. TextBox.Text, Label.Text apod.) na hlavním formuláři z UserControlu. Zkoušel jsem "experimentovat" s reflexí, childControl.Parent i vyhledáváním Controlů, ale vše bezúspěšně :-( Jediné co jede (ale je to prasárna kterou nechci použít) je vytvořit pro UserControl novou vlastnost (property) a tam si předávat úplnou instanci hlavního formuláře (frmMain) . Pro úplnost přikládám jak to nyní funguje, chyba je znázorněna v bodu 4: 1) Mám vytvořenou třídu pro UserControly:
/// <summary>
/// Base user control public class
/// - for extend properties standard user controls
/// </summary>
public class BaseUserControl : UserControl
{
/// <summary>
/// User control name
/// </summary>
private string myUserControlName = String.Empty;
[Category("BaseUserControl"),
Description("User control name"),
Browsable(true)]
public string UserControlName
{
get { return myUserControlName; }
set { myUserControlName = value; }
}
}
2) Ve formuláři (frmMain) volám dle stisku v menu metodu:
this.LoadUserControl(new UserControls.FileSystem.ucTest());
3) Tato metoda (LoadUserControl) obsahuje:
/// <summary>
/// Load user control to panelMain
/// </summary>
/// <param name="myControl"></param>
private void LoadUserControl(BaseUserControl myControl)
{
// declare variables
string strUserControlImagePath = String.Empty;
try
{
// remove the last loaded user control
if (splitcontainerMain.Panel2.Controls.Count > 0)
splitcontainerMain.Panel2.Controls.RemoveAt(0);
// load current control and docked them
splitcontainerMain.Panel2.Controls.Add(myControl);
myControl.Dock = DockStyle.Fill;
// append informations and image
lblUserControlHeading.Text = myControl.UserControlName;
//TODO: lblUserControlDescription.Text = myControl.UserControlDescription;
//TODO: pictureboxUserControl.Image = myControl.UserControlImage;
}
catch (Exception myException)
{
// write event to log file
EventManager.WriteToEventLog(myException.ToString(), EventLogType.Error);
}
}
4) Pokud dojde k načtení UserControlu, je začátek kódu UserControlu:
public partial class ucTest : BaseUserControl
{
/// <summary>
/// UserControl load method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ucTest_Load(object sender, EventArgs e)
{
// TOTO FUNGUJE KOREKTNĚ
// append user control properties
this.UserControlName = "NÁZEV - TEST";
}
private void btnExecute_Click(object sender, EventArgs e)
{
// TADY NEDOKÁŽU ZMĚNIT VLASTNOST this.UserControlName (ev. controlu lblHeading.Text ve frmMain)
// ver36
//if (this.Parent != null && this.Parent.GetType() != typeof(frmMain))
//{
// Label aaa = (this.Parent as frmMain).Controls["lblUserControlHeading"] as Label;
// aaa.Text = "šáž íezýáíewzfgisudhgfghdsghuízfáísdfýdsf žf dsýáížfdýsá";
//}
}
.....
}
Děkuji, Petr
|