Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 12:15 Der er 31 kommentarer og
1 løsning

Delegates på tværs af usercontrols

Hej!

Er der nogen mulighed for at benytte Delegates på tværs af usercontrols?

Hvis ja, hvor skal jeg evt. gøre?

Hvis ikke det kan lade sig gøre, kan man så via reference til den enkelte usercontrol sender events til dem?

Jeg har nemlig et hovedprojekt som er almindeligt C# projekt, samtidig har jeg x antal usercontrols som jeg loader ind i dette hovedprogram. 
Jeg ønsker fra nogle af mine usercontrols af bede hovedprogrammet om at vise en anden usercontrol end den aktuelle.

Nogen som har en ide til hvordan det kan lade sig gøre?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 12:24 #1
jeg har gjort med med events i asp.net på denne måde:

Hoved kontrol:
ucProductPrice.OnProductPriceChanged += new UserControls_ProductPrice.ProductEventHandler(ucProductPrice_OnProductPriceChanged);

  void ucProductPrice_OnProductPriceChanged(ProductEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }


underkontrol:

public delegate void ProductEventHandler(ProductEventArgs e);
    public event ProductEventHandler OnProductPriceChanged;

Raise event med:
ProductEventArgs epe = new ProductEventArgs();
        if (OnProductPriceChanged != null)
        {
            OnProductPriceChanged(epe);
        }


ProductEventArgs klasse:
public class ProductEventArgs :EventArgs
{

    public int ProductID;
    public string ValuePath;
   
}
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 12:25 #2
Jeg ved ikke om det er noget i den stil du sørger.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 12:50 #3
muligvis!

Mit hovedprogram ligger i et namespace og mine usercontrols ligger i forskellige namespaces.

Jeg havde planer om at inkludere mit hovedprogram i hver usercontrol og på den måde have adgang til dens namespace, men det kan jeg ikke, da den så vil gå i loop!

Men i min usercontrol ønsker jeg at kalde en funktion i mit hovedprogram, kan jeg dette
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 12:55 #4
Du kan gøre det ved at sende et event tilbage til dig hovedprogram og i denne event så kalde den nødvendige metode
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:01 #5
okay, hvordan kan jeg gøre det ?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:10 #6
Evt på den måde som jeg vist i min første post.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:12 #7
Men ligger de ikke i samme namespace ???

mit hovedprogram har allere en reference til usercontrollen!

Jeg ønsker bare at kunne kommunikere den anden vej også?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:14 #8
du skal bare bruge navnet på den usercontrol du har tilføjet.

dinusercontrol. <--- så finder du public metoder i din usercontrol.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:22 #9
Jamen!

Jeg "tror" jeg gerne vil den anden vej!

Jeg vil gerne via en event i min usercontrol, sende en event eller kalde en funktion i mit hovedprogram.
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:36 #10
ah nu tror jeg at jeg er med:
Jeg har en windows form som indeholder denne kode:
public delegate void FindSubjectMethod(int itemid);
       
        /// <summary>
        /// Used for setting the active index in the binding source
        /// </summary>
        /// <param name="itemid">the</param>
        public void FindSubject(int itemid)
        {
            if (InvokeRequired)
            {
                FindSubjectMethod method = new FindSubjectMethod(FindSubject);
                Invoke(method, new object[] { itemid });
                return;
            }
            label.text = itemid.ToString();
        }
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:38 #11
Metoden kalder jeg med:
MainForm.FindSubject();

Jeg sender en reference at hovedformen med
public HelpDeskApplicationContext(HelpDeskForm mainForm)
{
}
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:39 #12
gemmer du så din reference i HelpDeskApplicationContext eller ?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:40 #13
ja det gør jeg.
Jeg opretter et nyt HelpDeskForm object kaldet MainForm
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:43 #14
hmm!

Men hvordan får du så tilføjet en reference i din usercontrol som tillader et objekt af hovedformen, når hovedformen allerede har en reference til din usercontrol

eller skal det bare være af type object i usercontrollen?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:48 #15
Min konstruktør til userkontrollen ser sådan ud:
private HelpDeskForm MainForm;
public HelpDeskApplicationContext(HelpDeskForm mainForm, Splash sp)
        {
            this.MainForm = mainForm;
            //load data først
            sp.Show();
            sp.Disposed += new EventHandler(sp_Disposed);
            //ListOfSubjects.LoadSubjects();
         
        }


når jeg laver en instans af usercontrollen sender jeg hoved formen med på denne måde:
HelpDeskApplicationContext applicationContext = new HelpDeskApplicationContext(this, new Splash(this));
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 13:52 #16
hmm, okay!

Jeg får ikke love til den der private erklæring: får følgende debug fejl
Error    2    The type or namespace name 'Console_name' could not be found (are you missing a using directive or an assembly reference?)    D:\Visual Studio 2005\Projects\_Console\ConsoleView\ConsoleView.cs    17    17    ConsoleView

Jeg kan ikke tilføje denne reference da jeg jo har tilføjet min Usercontrol som reference i mit hovedprogram?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 13:54 #17
prøv lige at vise din kode.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:02 #18
Min usercontrol
------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace ConsoleView
{
    public partial class Console_view : UserControl
    {
        private string _productionreport = "";
        private bool _pluconfirmed = false;
        private int _type = 0;

        public Console_view()
        {           
            this.SuspendLayout();
            InitializeComponent();
            this.ResumeLayout(true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.BackColor = Color.FromArgb(162, 162, 162);
        }

.. . . . . . . . .

------------------------------------------------------

Mit hovedprogram
------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Console_name
{
    public partial class Console_main : Form
    {
        private SystemHandle.TextElement[] element = new SystemHandle.TextElement[6];
        private System.Windows.Forms.Timer t_clock = new System.Windows.Forms.Timer();

        public Console_main()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.BackColor = Color.FromArgb(162, 162, 162);
            this.header.Show();
            this.uc_console.ProductionReportName = "Productdisplay";
            element[0] = new SystemHandle.TextElement("Lineconsole", "uc_console");
            element[1] = new SystemHandle.TextElement("Item Database", "uc_webinterface");
            element[2] = new SystemHandle.TextElement("Lineviewer", "uc_lineviewer");
            element[3] = new SystemHandle.TextElement("Analyser", "uc_productionreport");
            element[4] = new SystemHandle.TextElement("Productdisplay", "uc_product_display");
            element[5] = new SystemHandle.TextElement("Linestatus", "uc_linestatus");
            this.header_time.Text = DateTime.Now.ToShortDateString() + "-" + DateTime.Now.ToLongTimeString();
//            InitializePanels();
            InitializeTimer();
           
            this.uc_product_display.LoadPictures(12, "toplabeldummy", "bottomlabeldummy", "basketlabeldummy", "spotlabeldummy", "inkjetlayoutdummy");

            // Opretter objekt af usercontrol
            this.uc_console = new ConsoleView.Console_view();
        }

-------------------------------------------------------------------------
I mit hovedprogram har jeg ligeledes en reference til ConsoleView, i References


Skriv hvis der er flere ting du vil have jeg skal poste
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:11 #19
//
            // uc_console
            //
            this.uc_console.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(162)))), ((int)(((byte)(162)))), ((int)(((byte)(162)))));
            this.uc_console.Location = new System.Drawing.Point(0, 100);
            this.uc_console.Margin = new System.Windows.Forms.Padding(0);
            this.uc_console.Name = "uc_console";
            this.uc_console.PLUConfirmed = false;
            this.uc_console.ProductionReportName = "";
            this.uc_console.Size = new System.Drawing.Size(1016, 610);
            this.uc_console.TabIndex = 8;
            this.uc_console.Type = 0;
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:12 #20
brug:
this.uc_console = new ConsoleView.Console_view(this);

-----uc-----------------------

private Console_name.Console_main CM;
public Console_view(Console_name.Console_main _cm)
        {   
CM=_cm;     
            this.SuspendLayout();
            InitializeComponent();
            this.ResumeLayout(true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.BackColor = Color.FromArgb(162, 162, 162);
        }
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:13 #21
så bruger du CM.Metodenavn();
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:19 #22
Error    1    The type or namespace name 'Console_name' could not be found (are you missing a using directive or an assembly reference?)    D:\Visual Studio 2005\Projects\_Console\ConsoleView\ConsoleView.cs    17    29    ConsoleView


i uc
----------------------
      public Console_view(Console_name.Console_main cm)
        {           
            this.SuspendLayout();
            InitializeComponent();
            this.ResumeLayout(true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.BackColor = Color.FromArgb(162, 162, 162);
        }
-----------------------
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:20 #23
mit problem er jo at jeg ikke kan have en reference i min usercontrol som henviser til mit hovedprogram, da den gør det modsatte vej
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:21 #24
altså hovedprogrammet har en reference til usercontrollen
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:24 #25
prøv at smide dem i samme namespace.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:26 #26
kan man det, når det er selvstændige projekter ?
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:29 #27
så kan du kun gøre det på den måde jeg først viste det.
altså sende et event fra usercontrol til main form.
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:32 #28
så kan det godt jeg være, jeg lige vil be om en forklaring på hvad du gør?
i det eksempel, for så man jeg igang med det
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:36 #29
-----uc-----------------------
public delegate void EventHandler(EventArgs e);
public event EventHandler OnEvent;

public Console_view()
        {     
            this.SuspendLayout();
            InitializeComponent();
            this.ResumeLayout(true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
            this.BackColor = Color.FromArgb(162, 162, 162);
        }
Avatar billede dr_chaos Nybegynder
16. januar 2007 - 14:39 #30
namespace Console_name
{
    public partial class Console_main : Form
    {
        private SystemHandle.TextElement[] element = new SystemHandle.TextElement[6];
        private System.Windows.Forms.Timer t_clock = new System.Windows.Forms.Timer();

        public Console_main()
        {
  this.uc_console = new ConsoleView.Console_view();
uc_console.OnEvent+= New EventHandler(uc_console_OnEvent)

}

void uc_console_OnEvent(EventArgs e)
    {
        //lavnoget
    }
Avatar billede testpilot_dk Nybegynder
16. januar 2007 - 14:50 #31
takker, send et svar!

Nu spiller det
Avatar billede dr_chaos Nybegynder
17. januar 2007 - 07:43 #32
perfekt :)
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