update label op form vanuit andere class

Status
Niet open voor verdere reacties.

Buzzy

Gebruiker
Lid geworden
25 sep 2009
Berichten
37
Hallo,

ik stoei al een tijdje met een probleem. Ik heb een add in gemaakt voor Solidworks middels een daarvoor gemaakt template. Deze add in laad bij het starten van solidworks een taskpane. Dit is een form. Op dit form in de class
Code:
public partial class KoppelingTaskpane : UserControl
staan onder andere een label label1 en een button button1. Als ik op de button klik dan update label1. Dat werkt prima. Echter nu wil ik dat label1 geupdate wordt wanneer ik een custom property van het geladen part verander. Hiervoor is een eventhandler:
Code:
doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(PropertyChange);
Deze eventhandler staat in de class:
Code:
public class PartEventHandler : DocumentEventHandler
Nu is mijn vraag, hoe krijg ik het voor elkaar dat wanneer PropertyChange wordt aangeroepen label1 geupdate wordt? Ik heb dit al geprobeerd met backgroundworker en invoke enzo. Echter heb ik hiermee geen ervaring dus de kans dat ik iet fout doe is groot. Ik gebruik VS2010.

Zou iemand me hiermee kunnen helpen? Ik kan het project niet als bijlage toevoegen ivm de grote van de .zip. Hierbij de link naar het bestand: HIER

Alvast bedankt!
 
Ik zie de context niet helemaal. Als er een event is waarop je je kan registreren, hoef je alleen je eigen eventhandler op te geven en de update van je form (inderdaad via een invoke waarschijnlijk) uit te voeren.

Hier een stukje code die mijn scherm update als iemand connectie maakt met de server (de server geeft de event "OnConnection"). Deze code staat allemaal onder "form1" en dus niet in de server code. Omdat het asynchroon is gaat dit via een delegate.

Code:
MyServer.OnConnection += new EventHandler(MyServer_OnConnection);

void MyServer_OnConnection(object sender, EventArgs e)
        {
            listBox1.Invoke(new ListUpdate(this.update_listbox)); //listbox updaten als en een connect is
        }
 
Hallo,

ik snap er nog niet veel van. Ik heb 3 classes. 1 om mijn form in solidworks te laden, 1 om mijn form te creëren en 1 welke PartEventHandler genoemd wordt. In die laatste staat:
Code:
doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(PropertyChange);
Hoe krijg ik het nu voor elkaar om met PropertyChange een label te updaten op mijn form?

Groeten,

Robin
 
Wat staat er in de routine "PropertyChange" ? Ik neem tenminste aan dat dit, zoals bij een normale eventhandler, verwijst naar de procedure die de event verder afhandelt. Ik ben verder niet bekend met SolidWorks helaas.
 
Code:
public int PropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
        {
            return 10;
        }

Er staat nu niets meer in. Maar wat ik er ook in zet, bijvoorbeeld de methode die de labels update, de label update niet. Heeft u nog een idee?

Groet
 
Gooi er eens een messagebox of debugline in om te zien of de procedure wel wordt aangesproken (eventueel een break kan ook natuurlijk). Als dat het geval is moet je vanuit deze code de invoke op je label aanroepen. Deze codes zijn soms lastig goed te krijgen.
 
De functie wordt wel aangeroepen. Maar dit erin werkt niet:
Code:
if (this.textBox1.InvokeRequired)
this.textBox1.Invoke(new TextBoxDelegate(UpdatingTextBox), new object[] { msg });
else
this.textBox1.Text = msg;

Maar even voor de duidelijkheid, in welke class moet ik nu welke code in zetten?
 
Laatst bewerkt:
Dat is afhankelijk van je namespace en project.

Maar waar wordt "msg" geregeld? En updatingtextbox? Op zich vreemd dat het wel goed wordt uitgevoerd. Meestal is de compiler redelijk moeilijk over deze constructies
 
Code:
public void SomethingToDo(object obj)
        {
            //I will create an example loop which, 
            //from which I will pass the value to textBox on KoppelingTaskpane1 class:
            int myValue = Convert.ToInt32(obj);
            for (int i = 0; i < myValue; i++)
            {
                KoppelingTaskpane1.UpdatingTextBox(i.ToString());
                //wait for a bit:
                System.Threading.Thread.Sleep(200);
            }

Hier is mijn project. Ik weet het, het is een zooitje en het zal moeilijk zijn voor iemand om dit uit te pluizen maar ik ben er al zo lang mee bezig...

SwAddin.cs:
Code:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Collections;
using System.Reflection;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swpublished;
using SolidWorks.Interop.swconst;
using SolidWorksTools;
using SolidWorksTools.File;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;


namespace Callback_Test
{
    /// Summary description for Callback_Test.
    [Guid("fb500eff-b1df-40fb-bf7d-09cd2fc48309"), ComVisible(true)]
    [SwAddin(
        Description = "Test CallBack",
        Title = "Callback Test",
        LoadAtStartup = true
        )]
    public class SwAddin : ISwAddin
    {
        #region Local Variables
        ISldWorks iSwApp = null;
        ICommandManager iCmdMgr = null;
        int addinID = 0;
        BitmapHandler iBmp;
        public SldWorks mSWApplication2;
        public int mSWCookie;
        private TaskpaneView mTaskpaneView;
        public KoppelingTaskpane mTaskpaneHost;

        public SldWorks mSWApplication;
        public int mCookie;
        public CommandManager mCommandManager;
        //public ModelDoc2 swModel;
        CustomPropertyManager swCustProp;
        bool pathName;
        string val = "";
        string valout = "";
        
        public const int mainCmdGroupID = 5;
        public const int mainItemID1 = 0;
        public const int mainItemID2 = 1;
        public const int mainItemID3 = 2;
        public const int flyoutGroupID = 91;
        PartDoc doc;

        #region Event Handler Variables
        Hashtable openDocs = new Hashtable();
        SolidWorks.Interop.sldworks.SldWorks SwEventPtr = null;
        #endregion

        #region Property Manager Variables
        UserPMPage ppage = null;
        #endregion


        // Public Properties
        public ISldWorks SwApp
        {
            get { return iSwApp; }
        }
        public ICommandManager CmdMgr
        {
            get { return iCmdMgr; }
        }

        public Hashtable OpenDocs
        {
            get { return openDocs; }
        }

        #endregion

        #region SolidWorks Registration
        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(Type t)
        {
            #region Get Custom Attribute: SwAddinAttribute
            SwAddinAttribute SWattr = null;
            Type type = typeof(SwAddin);

            foreach (System.Attribute attr in type.GetCustomAttributes(false))
            {
                if (attr is SwAddinAttribute)
                {
                    SWattr = attr as SwAddinAttribute;
                    break;
                }
            }

            #endregion

            try
            {
                Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
                Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser;

                string keyname = "SOFTWARE\\SolidWorks\\Addins\\{" + t.GUID.ToString() + "}";
                Microsoft.Win32.RegistryKey addinkey = hklm.CreateSubKey(keyname);
                addinkey.SetValue(null, 0);

                addinkey.SetValue("Description", SWattr.Description);
                addinkey.SetValue("Title", SWattr.Title);

                keyname = "Software\\SolidWorks\\AddInsStartup\\{" + t.GUID.ToString() + "}";
                addinkey = hkcu.CreateSubKey(keyname);
                addinkey.SetValue(null, Convert.ToInt32(SWattr.LoadAtStartup), Microsoft.Win32.RegistryValueKind.DWord);
            }
            catch (System.NullReferenceException nl)
            {
                Console.WriteLine("There was a problem registering this dll: SWattr is null. \n\"" + nl.Message + "\"");
                System.Windows.Forms.MessageBox.Show("There was a problem registering this dll: SWattr is null.\n\"" + nl.Message + "\"");
            }

            catch (System.Exception e)
            {
                Console.WriteLine(e.Message);

                System.Windows.Forms.MessageBox.Show("There was a problem registering the function: \n\"" + e.Message + "\"");
            }
        }

        [ComUnregisterFunctionAttribute]
        public static void UnregisterFunction(Type t)
        {
            try
            {
                Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
                Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser;

                string keyname = "SOFTWARE\\SolidWorks\\Addins\\{" + t.GUID.ToString() + "}";
                hklm.DeleteSubKey(keyname);

                keyname = "Software\\SolidWorks\\AddInsStartup\\{" + t.GUID.ToString() + "}";
                hkcu.DeleteSubKey(keyname);
            }
            catch (System.NullReferenceException nl)
            {
                Console.WriteLine("There was a problem unregistering this dll: " + nl.Message);
                System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: \n\"" + nl.Message + "\"");
            }
            catch (System.Exception e)
            {
                Console.WriteLine("There was a problem unregistering this dll: " + e.Message);
                System.Windows.Forms.MessageBox.Show("There was a problem unregistering this dll: \n\"" + e.Message + "\"");
            }
        }

        #endregion

        #region ISwAddin Implementation
        public SwAddin()
        {
        }

        public bool ConnectToSW(object ThisSW, int cookie)
        {
            mSWApplication = (SldWorks)ThisSW;
            mSWCookie = cookie;

            // Set-up add-in call back info 
            bool result = mSWApplication.SetAddinCallbackInfo(0, this, cookie);
           
            
            iSwApp = (ISldWorks)ThisSW;
            addinID = cookie;

            //Setup callbacks
            iSwApp.SetAddinCallbackInfo(0, this, addinID);
            
            #region Setup the Event Handlers
            SwEventPtr = (SolidWorks.Interop.sldworks.SldWorks)iSwApp;
            
            openDocs = new Hashtable();
            AttachEventHandlers();
            #endregion

            this.UISetup(); 
            return true;
        }

        public bool DisconnectFromSW()
        {
            DetachEventHandlers();

            System.Runtime.InteropServices.Marshal.ReleaseComObject(iSwApp);
            iSwApp = null;
            //The addin _must_ call GC.Collect() here in order to retrieve all managed code pointers 
            GC.Collect();
            GC.WaitForPendingFinalizers();

            GC.Collect();
            GC.WaitForPendingFinalizers();
            this.UITeardown();
            return true;
        }
        #endregion

        #region UI Methods
        public void UISetup()
        {
            mTaskpaneView = mSWApplication.CreateTaskpaneView2(Assembly.GetExecutingAssembly().Location.Replace(".dll", ".bmp"), "Solidworks <-> Isah Koppeling");
            mTaskpaneHost = (KoppelingTaskpane)mTaskpaneView.AddControl(KoppelingTaskpane.SWTASKPANE_PROGID, "");
            if (mTaskpaneHost != null)
            {
                mTaskpaneHost.Init(this.mSWApplication);
            }
        }
        public void UITeardown()
        {
            mTaskpaneHost = null;
            mTaskpaneView.DeleteView();
            Marshal.ReleaseComObject(mTaskpaneView);
            mTaskpaneView = null;
        }
 
        public bool CompareIDs(int[] storedIDs, int[] addinIDs)
        {
            List<int> storedList = new List<int>(storedIDs);
            List<int> addinList = new List<int>(addinIDs);

            addinList.Sort();
            storedList.Sort();

            if (addinList.Count != storedList.Count)
            {
                return false;
            }
            else
            {

                for (int i = 0; i < addinList.Count; i++)
                {
                    if (addinList[i] != storedList[i])
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        #endregion

        #region Event Methods
        public bool AttachEventHandlers()
        {
            AttachSwEvents();
            //Listen for events on all currently open docs
            AttachEventsToAllDocuments();
            return true;
        }

        private bool AttachSwEvents()
        {
            try
            {
                SwEventPtr.ActiveDocChangeNotify += new DSldWorksEvents_ActiveDocChangeNotifyEventHandler(OnDocChange);
                SwEventPtr.DocumentLoadNotify2 += new DSldWorksEvents_DocumentLoadNotify2EventHandler(OnDocLoad);
                SwEventPtr.FileNewNotify2 += new DSldWorksEvents_FileNewNotify2EventHandler(OnFileNew);
                SwEventPtr.ActiveModelDocChangeNotify += new DSldWorksEvents_ActiveModelDocChangeNotifyEventHandler(OnModelChange);
                SwEventPtr.FileOpenPostNotify += new DSldWorksEvents_FileOpenPostNotifyEventHandler(FileOpenPostNotify);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }
        
        private bool DetachSwEvents()
        {
            try
            {
                SwEventPtr.ActiveDocChangeNotify -= new DSldWorksEvents_ActiveDocChangeNotifyEventHandler(OnDocChange);
                SwEventPtr.DocumentLoadNotify2 -= new DSldWorksEvents_DocumentLoadNotify2EventHandler(OnDocLoad);
                SwEventPtr.FileNewNotify2 -= new DSldWorksEvents_FileNewNotify2EventHandler(OnFileNew);
                SwEventPtr.ActiveModelDocChangeNotify -= new DSldWorksEvents_ActiveModelDocChangeNotifyEventHandler(OnModelChange);
                SwEventPtr.FileOpenPostNotify -= new DSldWorksEvents_FileOpenPostNotifyEventHandler(FileOpenPostNotify);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }

        }
              
        public void AttachEventsToAllDocuments()
        {
            ModelDoc2 modDoc = (ModelDoc2)iSwApp.GetFirstDocument();
            while (modDoc != null)
            {
                if (!openDocs.Contains(modDoc))
                {
                    AttachModelDocEventHandler(modDoc);
                }
                else if (openDocs.Contains(modDoc))
                {
                    bool connected = false;
                    DocumentEventHandler docHandler = (DocumentEventHandler)openDocs[modDoc];
                    if (docHandler != null)
                    {
                        connected = docHandler.ConnectModelViews();
                    }
                }

                modDoc = (ModelDoc2)modDoc.GetNext();
            }
        }

        public bool AttachModelDocEventHandler(ModelDoc2 modDoc)
        {
            if (modDoc == null)
                return false;

            DocumentEventHandler docHandler = null;

            if (!openDocs.Contains(modDoc))
            {
                switch (modDoc.GetType())
                {
                    case (int)swDocumentTypes_e.swDocPART:
                        {
                            docHandler = new PartEventHandler(modDoc, this);
                            break;
                        }
                    case (int)swDocumentTypes_e.swDocASSEMBLY:
                        {
                            docHandler = new AssemblyEventHandler(modDoc, this);
                            break;
                        }
                    case (int)swDocumentTypes_e.swDocDRAWING:
                        {
                            docHandler = new DrawingEventHandler(modDoc, this);
                            break;
                        }
                    default:
                        {
                            return false; //Unsupported document type
                        }
                }
                docHandler.AttachEventHandlers();
                openDocs.Add(modDoc, docHandler);
            }
            return true;
        }

        public bool DetachModelEventHandler(ModelDoc2 modDoc)
        {
            DocumentEventHandler docHandler;
            docHandler = (DocumentEventHandler)openDocs[modDoc];
            openDocs.Remove(modDoc);
            modDoc = null;
            docHandler = null;
            return true;
        }

        public bool DetachEventHandlers()
        {
            DetachSwEvents();

            //Close events on all currently open docs
            DocumentEventHandler docHandler;
            int numKeys = openDocs.Count;
            object[] keys = new Object[numKeys];

            //Remove all document event handlers
            openDocs.Keys.CopyTo(keys, 0);
            foreach (ModelDoc2 key in keys)
            {
                docHandler = (DocumentEventHandler)openDocs[key];
                docHandler.DetachEventHandlers(); //This also removes the pair from the hash
                docHandler = null;
            }
            return true;
        }
        #endregion

        #region Event Handlers
        //Events

        public int Propnot(string propName, string Configuration, string oldValue, string NewValue, int valueType)
        {
            MessageBox.Show("alskdhfalk;jsdhasdfg");
            return 0;
        }
        public int OnDocChange()
        {   
           return 0;
        }

        public int OnDocLoad(string docTitle, string docPath)
        {
            ModelDoc2 swModel2 = mSWApplication.IActiveDoc2;
            MessageBox.Show("swModel2 = " + swModel2, "hasd;lhasdf;");
            return 0;
        }

        int FileOpenPostNotify(string FileName)
        {
            AttachEventsToAllDocuments();
            return 0;
        }

        public int OnFileNew(object newDoc, int docType, string templateName)
        {
            AttachEventsToAllDocuments();
            return 0;
        }

        public int OnModelChange()
        {
            return 0;
        }

        #endregion
    }

}

KoppelingTaskpane.cs

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swcommands;
using SolidWorks.Interop.swconst;
using SolidWorks.Interop.swpublished;
using SolidWorksTools;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Timers;
using System.Threading;
using System.IO;
using System.Reflection;


namespace Callback_Test 
{
    //Declare a new delegate specific to updating the text of a label         
    delegate void UpdateLabels(string text);


    [ComVisible(true)]
    [ProgId(SWTASKPANE_PROGID)]
    public partial class KoppelingTaskpane : UserControl

        
    {
            System.Threading.Thread thread;
            delegate void TextBoxDelegate(string message);
            public SldWorks mSWApplication;
            public int mCookie;
            public CommandManager mCommandManager;
            public ModelDoc2 swModel;
            public ModelDoc2 modDoc;
            public ModelDoc2 swModel2;
            SolidWorks.Interop.sldworks.View swView = default(SolidWorks.Interop.sldworks.View);
            public SketchManager swSketchMgr;
            public Sketch swSketch;
            public SldWorks swApp;
            bool pathName;
            string val = "";
            string valout = "";
            CustomPropertyManager swCustProp;
            public AssemblyDoc swAssembly;
            public BackgroundWorker backgroundWorker1;
            private TaskpaneView mTaskpaneView;
            public KoppelingTaskpane mTaskpaneHost;
            public int stop = 0;
            public SwAddin addin;
            PartDoc doc;

            public const string SWTASKPANE_PROGID = "Robin.KoppelingTaskpane2_AddInRobin";
            
            public KoppelingTaskpane()
            {
                InitializeComponent();
            } 
                
            public void Init(SldWorks app)
            {
                mSWApplication = app;
                
            }
            string propName;
            string Configuration;
            string oldValue;
            string NewValue;
            int valueType;

            public void button1_Click(object sender, EventArgs e)
            {
                PropertyChange(propName, Configuration, oldValue, NewValue, valueType);
            }
            public int myValue;
            public void CreatingNewThread()
            {
                int myValue = 40; //some value to pass as parameter to the other Thread
                Test other = new Test(this); //passing param to constructor 
                thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(other.SomethingToDo));
                thread.Start(myValue);
            }
            public void UpdatingTextBox(string msg)
            {
                if (this.textBox1.InvokeRequired)
                    this.textBox1.Invoke(new TextBoxDelegate(UpdatingTextBox), new object[] { msg });
                else
                    this.textBox1.Text = msg;
            }

            public void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    doc = (PartDoc)modDoc;
                    doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(PropertyChange);
                }
                catch 
                {
                    MessageBox.Show("jshdfjh\n" + e);
                }
            }

            
            public void SelectAllinDocument(ModelDoc2 swModel3, ModelDocExtension swModelDocExt, SelectionMgr swSelMgr2)
            {
                int selCount;

                // Select all edges in a part, all components in an assembly,
                // or all entities in a drawing
                swModelDocExt.SelectAll();

                // Get and print the number of selections
                selCount = 0;
                selCount = swSelMgr2.GetSelectedObjectCount2(-1);

                switch (swModel3.GetType())
                {
                    case (int)swDocumentTypes_e.swDocPART:
                        Debug.Print("Number of edges selected in part          = " + selCount);
                        break;
                    case (int)swDocumentTypes_e.swDocASSEMBLY:
                        Debug.Print("Number of components selected in assembly = " + selCount);
                        break;
                    case (int)swDocumentTypes_e.swDocDRAWING:
                        Debug.Print("Number of entities selected in drawing    = " + selCount);
                        break;
                    default:
                        Debug.Print("Unknown type of document.");
                        break;
                }
            }

            public void label1_Click(object sender, EventArgs e)
            {

            }

            public void label2_Click(object sender, EventArgs e)
            {

            }

            private void KoppelingTaskpane_Load(object sender, EventArgs e)
            {

            }
            public void help2()
            {
                this.backgroundWorker1.RunWorkerAsync();
                InitializeComponent();
            }

            public void help()
            {
                MessageBox.Show("Property gewijzigd!");
                Thread.Sleep(5000);
                
                //Stop de backgroundworker
                this.backgroundWorker1.CancelAsync();
            }
            public void UpdateLabel(String str)
            {
                string Testtest;
                Testtest = label1.ToString();
                MessageBox.Show("str = " + Testtest);
                label1.Text = str;
                MessageBox.Show("str = " + str);
            }

                 
            void UpdateLabelText(Label lbl, string text)
            {
               
            }
            //This method is invoked by our delegate and actually updates the label //text         
            void UpdateLabelTextByDelegate(Label lbl, string text)
            {
                lbl.Text = text;
            }
            public int PropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
            {
                MessageBox.Show("", "!?");
                //MessageBox.Show("Button 2 geklikt. Properties moet nu worden geupdate", "Fout");
                try
                {
                    // Code die een exceptie kan opleveren
                    MessageBox.Show("" + swApp, "0");
                    swApp = (SldWorks)Activator.CreateInstance(
                    Type.GetTypeFromProgID("SldWorks.Application"));
                    MessageBox.Show("" + swApp, "1");
                    swModel2 = swApp.IActiveDoc2;
                    MessageBox.Show("" + swModel2, "2");
                    swCustProp = swModel2.Extension.get_CustomPropertyManager("");
                    MessageBox.Show("" + swCustProp, "3");
                    pathName = swCustProp.Get4("PartNo", false, out val, out valout);
                    MessageBox.Show("" + pathName, "4");
                    //PropID = swCustProp.Set("PartNo", "Test");
                    //if (val != "" & valout != "")
                    //{
                        MessageBox.Show("" + val, "5");
                        label1.Text = val;
                        MessageBox.Show("" + valout, "6");
                        label2.Text = valout;
                        //MessageBox.Show(
                        //    "Value:                    " + val + 
                        //    "\nEvaluated value:          " + valout + 
                        //    "\nUp-to-date data:          " + pathName);
                    //}
                    //else
                    //{

                    //    if (Melding == 0)
                    //    {
                    //        MessageBox.Show("Property 'PartNo' bestaat niet");
                    //        Melding++;
                    //    }
                    //}
                        MessageBox.Show("" + textBox1.ToString(), "7");
                        textBox1.Text = "het lukt tot hier";
                        MessageBox.Show("" + textBox1.ToString(), "8");
                        return 1;
                    
                    
                }
                catch (System.Exception e)
                {
                    //Verwerk een systeemexceptie

                   //label1.BeginInvoke(delegate { label1.Text = "No Document"; }); 
                    MessageBox.Show("Er is geen document geopend: \n" + e);
                    return 0;
                }
            }

            private void backgroundWorker1_RunWorkerCompleted( 
                   object sender,
                   RunWorkerCompletedEventArgs e)
            {
                if (e.Cancelled) MessageBox.Show("Cancelled!");
                else if (e.Error != null) MessageBox.Show("Error!");
                else MessageBox.Show("Het resultaat is: " + e.Result);
                this.textBox1.Text =
                    "This text was set safely by BackgroundWorker.";
            }
        


            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 2000; i++)
                {
                    if (stop != 0) backgroundWorker1.CancelAsync();
                    else if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    backgroundWorker1.ReportProgress(0, i);
                    Thread.Sleep(50);   //We vertragen het werk om een mooier resultaat te kunnen tonen
                }
                e.Result = 12345; //Enkel ter illustratie
            }

            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.label1.Text = ("" + backgroundWorker1.CancellationPending);
                progressBar1.Value = ((int)e.UserState) % 100;
                this.textBox1.Text = ("" + e.UserState);
            }

            private void button3_Click(object sender, EventArgs e)
            {
                swApp = (SldWorks)Activator.CreateInstance(
                    Type.GetTypeFromProgID("SldWorks.Application"));
                swModel2 = swApp.IActiveDoc2;
                swCustProp = swModel2.Extension.get_CustomPropertyManager("");
                //pathName = swCustProp.Get4("PartNo", false, out val, out valout);
                int henk = swCustProp.Set("PartNo", "Test");
            }

            private void label3_Click(object sender, EventArgs e)
            {

            }
        }
    }

EventHandling.cs

Code:
using System;
using System.IO;
using System.Windows.Forms;
using System.Collections;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;


namespace Callback_Test
{

    public class DocumentEventHandler : KoppelingTaskpane
    {
        protected ISldWorks iSwApp;
        protected ModelDoc2 document;
        protected SwAddin userAddin;
        protected Hashtable openModelViews;

       
        public DocumentEventHandler(ModelDoc2 modDoc, SwAddin addin)
        {
            document = modDoc;
            userAddin = addin;
            iSwApp = (ISldWorks)userAddin.SwApp;
            openModelViews = new Hashtable();

            //MessageBox.Show("In DocumentEventHandler... :" + modDoc.ToString() + ":" + iSwApp.ToString() + ":" + document.ToString());
        }

        virtual public bool AttachEventHandlers()
        {
            return true;
        }

        virtual public bool DetachEventHandlers()
        {
            return true;
        }

        public bool ConnectModelViews()
        {
            IModelView mView;
            mView = (IModelView)document.GetFirstModelView();

            while (mView != null)
            {
                if (!openModelViews.Contains(mView))
                {
                    DocView dView = new DocView(userAddin, mView, this);
                    dView.AttachEventHandlers();
                    openModelViews.Add(mView, dView);
                }
                mView = (IModelView)mView.GetNext();
            }
            return true;
        }

        public bool DisconnectModelViews()
        {
            //Close events on all currently open docs
            DocView dView;
            int numKeys;
            numKeys = openModelViews.Count;

            if (numKeys == 0)
            {
                return false;
            }


            object[] keys = new object[numKeys];

            //Remove all ModelView event handlers
            openModelViews.Keys.CopyTo(keys, 0);
            foreach (ModelView key in keys)
            {
                dView = (DocView)openModelViews[key];
                dView.DetachEventHandlers();
                openModelViews.Remove(key);
                dView = null;
            }
            return true;
        }

        public bool DetachModelViewEventHandler(ModelView mView)
        {
            DocView dView;
            if (openModelViews.Contains(mView))
            {
                dView = (DocView)openModelViews[mView];
                openModelViews.Remove(mView);
                mView = null;
                dView = null;
            }
            return true;
        }
    }

    public class PartEventHandler : DocumentEventHandler
    {
        PartDoc doc;
        bool pathName;
        string val = "";
        string valout = "";

        public PartEventHandler(ModelDoc2 modDoc, SwAddin addin)
            : base(modDoc, addin)
        {
            doc = (PartDoc)document;
            //MessageBox.Show("In PartEventHandler..........." + ":" + doc + ":" + doc.ToString());
           
        }
        override public bool AttachEventHandlers()
        {
            doc.DestroyNotify += new DPartDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify += new DPartDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);
            doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(PropertyChange);
            ConnectModelViews();

            return true;
        }

        override public bool DetachEventHandlers()
        {
            doc.DestroyNotify -= new DPartDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify -= new DPartDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);
            doc.ChangeCustomPropertyNotify += new DPartDocEvents_ChangeCustomPropertyNotifyEventHandler(PropertyChange);
            DisconnectModelViews();

            userAddin.DetachModelEventHandler(document);
            return true;
        }

        //Event Handlers
        public int OnDestroy()
        {
            DetachEventHandlers();
            return 0;
        }

        public int PropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
        {
           
            return 10;
        }

        public void UDProp()
        {
            #region oude code
            //CustomPropertyManager swCustProp;
            
            //try
            //{
            //    MessageBox.Show("In UDProp");
            //    // Code die een exceptie kan opleveren
            //    //swModel = mSWApplication.IActiveDoc2;
            //    swApp = (SldWorks)Activator.CreateInstance(
            //        Type.GetTypeFromProgID("SldWorks.Application"));
            //    MessageBox.Show("" + swApp, "0");
            //    swModel2 = swApp.IActiveDoc2;
            //    MessageBox.Show("" + swModel2, "1");
            //    swCustProp = swModel2.Extension.get_CustomPropertyManager("");
            //    MessageBox.Show("" + swCustProp, "2");
            //    pathName = swCustProp.Get4("PartNo", false, out val, out valout);
            //    MessageBox.Show("" + pathName, "3");
            //    MessageBox.Show("" + val, "4");
            //    MessageBox.Show("" + valout, "5");
            //    //PropID = swCustProp.Set("PartNo", "Test");
            //    if (val != "" & valout != "")
            //    {
            //        label1.Text = val;
            //        label2.Text = valout;
            //        //MessageBox.Show(
            //        //    "Value:                    " + val + 
            //        //    "\nEvaluated value:          " + valout + 
            //        //    "\nUp-to-date data:          " + pathName);
            //    }
            //    else
            //    {
            //        MessageBox.Show("Property 'PartNo' bestaat niet");
                    
            //    }

            //}
            //catch (System.Exception e)
            //{
            //    //Verwerk een systeemexceptie

            //    label1.Text = "No Document";
            //    MessageBox.Show("Er is geen document geopend: \n" + e);

            //}
            #endregion
            KoppelingTaskpane mc = new KoppelingTaskpane();
            UpdateLabels UpdateLabel = new UpdateLabels(mc.UpdateLabel);


            CustomPropertyManager swCustProp;
            swApp = (SldWorks)Activator.CreateInstance(
                    Type.GetTypeFromProgID("SldWorks.Application"));
            swModel2 = swApp.IActiveDoc2;
            swCustProp = swModel2.Extension.get_CustomPropertyManager("");
            pathName = swCustProp.Get4("PartNo", false, out val, out valout);
            MessageBox.Show("" + valout);
            UpdateLabel(valout);
        }
            
        public int OnNewSelection()
        {
            return 0;
        }
    }

    public class AssemblyEventHandler : DocumentEventHandler  
    {
        AssemblyDoc doc;
        SwAddin swAddin;

        public AssemblyEventHandler(ModelDoc2 modDoc, SwAddin addin)
            : base(modDoc, addin)
        {
            doc = (AssemblyDoc)document;
            swAddin = addin;
        }

        override public bool AttachEventHandlers()
        {
            doc.DestroyNotify += new DAssemblyDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify += new DAssemblyDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);
            doc.ComponentStateChangeNotify2 += new DAssemblyDocEvents_ComponentStateChangeNotify2EventHandler(ComponentStateChangeNotify2);
            doc.ComponentStateChangeNotify += new DAssemblyDocEvents_ComponentStateChangeNotifyEventHandler(ComponentStateChangeNotify);
            doc.ComponentVisualPropertiesChangeNotify += new DAssemblyDocEvents_ComponentVisualPropertiesChangeNotifyEventHandler(ComponentVisualPropertiesChangeNotify);
            doc.ComponentDisplayStateChangeNotify += new DAssemblyDocEvents_ComponentDisplayStateChangeNotifyEventHandler(ComponentDisplayStateChangeNotify);
            ConnectModelViews();

            return true;
        }

        override public bool DetachEventHandlers()
        {
            doc.DestroyNotify -= new DAssemblyDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify -= new DAssemblyDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);
            doc.ComponentStateChangeNotify2 -= new DAssemblyDocEvents_ComponentStateChangeNotify2EventHandler(ComponentStateChangeNotify2);
            doc.ComponentStateChangeNotify -= new DAssemblyDocEvents_ComponentStateChangeNotifyEventHandler(ComponentStateChangeNotify);
            doc.ComponentVisualPropertiesChangeNotify -= new DAssemblyDocEvents_ComponentVisualPropertiesChangeNotifyEventHandler(ComponentVisualPropertiesChangeNotify);
            doc.ComponentDisplayStateChangeNotify -= new DAssemblyDocEvents_ComponentDisplayStateChangeNotifyEventHandler(ComponentDisplayStateChangeNotify);
            DisconnectModelViews();

            userAddin.DetachModelEventHandler(document);
            return true;
        }

        //Event Handlers
        public int OnDestroy()
        {
            DetachEventHandlers();
            return 0;
        }

        


        public int OnNewSelection()
        {
            return 0;
        }

        //attach events to a component if it becomes resolved
        protected int ComponentStateChange(object componentModel, short newCompState)
        {
            ModelDoc2 modDoc = (ModelDoc2)componentModel;
            swComponentSuppressionState_e newState = (swComponentSuppressionState_e)newCompState;


            switch (newState)
            {

                case swComponentSuppressionState_e.swComponentFullyResolved:
                    {
                        if ((modDoc != null) & !this.swAddin.OpenDocs.Contains(modDoc))
                        {
                            this.swAddin.AttachModelDocEventHandler(modDoc);
                        }
                        break;
                    }

                case swComponentSuppressionState_e.swComponentResolved:
                    {
                        if ((modDoc != null) & !this.swAddin.OpenDocs.Contains(modDoc))
                        {
                            this.swAddin.AttachModelDocEventHandler(modDoc);
                        }
                        break;
                    }

            }
            return 0;
        }

        protected int ComponentStateChange(object componentModel)
        {
            ComponentStateChange(componentModel, (short)swComponentSuppressionState_e.swComponentResolved);
            return 0;
        }


        public int ComponentStateChangeNotify2(object componentModel, string CompName, short oldCompState, short newCompState)
        {
            return ComponentStateChange(componentModel, newCompState);
        }

        int ComponentStateChangeNotify(object componentModel, short oldCompState, short newCompState)
        {
            return ComponentStateChange(componentModel, newCompState);
        }

        int ComponentDisplayStateChangeNotify(object swObject)
        {
            Component2 component = (Component2)swObject;
            ModelDoc2 modDoc = (ModelDoc2)component.GetModelDoc();

            return ComponentStateChange(modDoc);
        }

        int ComponentVisualPropertiesChangeNotify(object swObject)
        {
            Component2 component = (Component2)swObject;
            ModelDoc2 modDoc = (ModelDoc2)component.GetModelDoc();

            return ComponentStateChange(modDoc);
        }

        



        
    }

    public class DrawingEventHandler : DocumentEventHandler
    {
        DrawingDoc doc;

        public DrawingEventHandler(ModelDoc2 modDoc, SwAddin addin)
            : base(modDoc, addin)
        {
            doc = (DrawingDoc)document;
        }

        override public bool AttachEventHandlers()
        {
            doc.DestroyNotify += new DDrawingDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify += new DDrawingDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);

            ConnectModelViews();

            return true;
        }

        override public bool DetachEventHandlers()
        {
            doc.DestroyNotify -= new DDrawingDocEvents_DestroyNotifyEventHandler(OnDestroy);
            doc.NewSelectionNotify -= new DDrawingDocEvents_NewSelectionNotifyEventHandler(OnNewSelection);

            DisconnectModelViews();

            userAddin.DetachModelEventHandler(document);
            return true;
        }

        //Event Handlers
        public int OnDestroy()
        {
            DetachEventHandlers();
            return 0;
        }

        public int OnNewSelection()
        {
            return 0;
        }
    }

    public class DocView
    {
        ISldWorks iSwApp;
        SwAddin userAddin;
        ModelView mView;
        DocumentEventHandler parent;

        public DocView(SwAddin addin, IModelView mv, DocumentEventHandler doc)
        {
            userAddin = addin;
            mView = (ModelView)mv;
            iSwApp = (ISldWorks)userAddin.SwApp;
            parent = doc;
        }

        public bool AttachEventHandlers()
        {
            mView.DestroyNotify2 += new DModelViewEvents_DestroyNotify2EventHandler(OnDestroy);
            mView.RepaintNotify += new DModelViewEvents_RepaintNotifyEventHandler(OnRepaint);
            return true;
        }

        public bool DetachEventHandlers()
        {
            mView.DestroyNotify2 -= new DModelViewEvents_DestroyNotify2EventHandler(OnDestroy);
            mView.RepaintNotify -= new DModelViewEvents_RepaintNotifyEventHandler(OnRepaint);
            parent.DetachModelViewEventHandler(mView);
            return true;
        }

        //EventHandlers
        public int OnDestroy(int destroyType)
        {
            switch (destroyType)
            {
                case (int)swDestroyNotifyType_e.swDestroyNotifyHidden:
                    return 0;

                case (int)swDestroyNotifyType_e.swDestroyNotifyDestroy:
                    return 0;
            }

            return 0;
        }

        public int OnRepaint(int repaintType)
        {
            return 0;
        }
    }

    public class Test
    {
        KoppelingTaskpane KoppelingTaskpane1;
        public Test(KoppelingTaskpane _form1)
        {
           
            this.KoppelingTaskpane1 = _form1;
        }
        public void SomethingToDo(object obj)
        {
            //I will create an example loop which, 
            //from which I will pass the value to textBox on form1 class:
            int myValue = Convert.ToInt32(obj);
            for (int i = 0; i < myValue; i++)
            {
                KoppelingTaskpane1.UpdatingTextBox(i.ToString());
                //wait for a bit:
                System.Threading.Thread.Sleep(200);
            }
        }
    }
}

screen1.jpg
 
Laatst bewerkt:
wat ik zou verwachten:

in "propertychange":
Code:
Label1.Invoke(new UpdateLabels(UpdateLabel),new Object[] {"henk"};
//of lbl.Invoke zie meerdere labels, mogelijk haal ik ze door elkaar
//mogelijk Label1.BeginInvoke beter
 
Laatst bewerkt:
Nu krijg ik deze foutmelding:
An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code

Additional information: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
 
In dat geval roep je invoke aan voordat je Label1 (of lbl) gemaakt is.

Je kunt dat voorkomen door de eerder genoemde Isinvokerequired check te gebruiken. Eventueel gecombineerd met IsHandleCreated. Maar IsInvokeRequired zou false moeten geven als de handle niet bestaat en deze exception moeten voorkomen.
 
Ik heb nu dit in de class KoppelingTaskpane:

Code:
public void UpdateLabel(String str)
            {
                if (this.label1.InvokeRequired)
                {
                    MessageBox.Show("InvokeRequired");
                    this.label1.BeginInvoke(new UpdateLabels(UpdateLabel), new Object[] { "henk" });
                }

                else
                {
                    MessageBox.Show("No InvokeRequired");
                    this.label1.Text = "Henk 2";
                }
                label1.Text = str;
                MessageBox.Show("str = " + str);
            }

en dit in PropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType) in de class PartEventHandler

Code:
 {
            MessageBox.Show("Propchange");
            UpdateLabel("Karel");
 }

Ik krijg de messagebox dat ik in 'PropertyChange' zit. Daarna ga ik naar 'No InvokeRequired' en dan geeft ie voor str 'Karel' aan. Karel geef ik mee vanuit PropertyChange. Wanneer ik str = label1.text; opgeef dan geeft ie aan voor str 'Henk 2'. De string wordt dus wel in het label geladen maar het label op mijn form wordt niet veranderd in Karel of Henk 2...

Enig idee?
 
Laatst bewerkt:
Uhm, Label1 wordt nooit aangemaakt? Als je een check doet op Label1.IsHandleCreated wat krijg je dan?

Volgens een aantal mensen is dit de best practice:

Code:
if (this.InvokeRequired)
4     {
5         this.BeginInvoke(new MethodInvoker(UpdateTheUI));
6     }
7     else
8     {
9         if (this.IsDisposed) return;
10 
11         if (!this.IsHandleCreated)
12         {
13             // Background processing completed before the
14             // control's handle has been created. Do whatever it takes
15             // to indicate that a deferred update must occur (after the handle has
16             // been created).
17 
18             _deferUIUpdate = true;
19             return;
20         }
21 
22         // Update the control, etc.
23     }

dit is voor een call op het object zelf. Als je this vervangt door Label1 zou het nog steeds moeten gelden. Je kunt dus even de checks voor disposed en handlecreated toevoegen en kijken of 1 van de condities geld. Anders ben ik ook even de weg kwijt :)
 
Is label1 wel "visible"? wordt Label1 correct aangemaakt in je form creation? Ik heb werkelijk geen idee of dit iets te maken heeft met solidworks of niet. Normaal gesproken zou je alleen de eerste keer dat je thread loopt mogelijk tegen dit probleem aan moeten lopen. Nadat de Label eenmaal getekend is op het scherm zou de handle moeten bestaan en kun je normaal gesproken dit gewoon gebruiken.

De events en delegates schijnen goed te werken, dus dat lijkt nu goed te zitten (of in ieder geval zoals ik het zelf soms implementeer ;) ). Waarom je de handle van Label1 niet gecreeerd krijgt gaat mijn kennis een beetje te boven, maar het verklaard wel waarom er niks veranderd :)
 
Dit is solidworks: screen1.jpg
Zoals je ziet worden de labels weergegeven en werkt het veranderen van de labels met de buttons wel (label2 is veranderd in 'test'). Wanneer ik dus via het scherm 'Summary information' een property verander en op 'OK' klik verschijnt de messagebox 'Propchange'. Pas wanneer ik de laatste messagebox wegklik verdwijnt het scherm 'Summary information'. Het label wordt niet grafisch veranderd. Wanneer ik een property wijzig met bijvoorbeeld button 2 krijg ik ook de messageboxen maar geen grafische verandering. Als ik met button 3 de waarde van label1 oproep staat er ook weer 'label1'.

Heb dus toch sterk het idee dat label1.text niet werkt. label1 wordt dus niet gewijzigd...

Zo wordt label1 aangemaakt:

Code:
this.label1 = new System.Windows.Forms.Label();
Code:
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(16, 79);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(35, 13);
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            this.label1.Click += new System.EventHandler(this.label1_Click);
Code:
this.Controls.Add(this.label1);
Code:
public System.Windows.Forms.Label label1;

Het label is visible...
 
Wordt niet per ongeluk een label1 op het hoofdform aangesproken? Wie is de "parent" van Label1 in je code? Als het niet zoiets is dan ziet hopelijk iemand anders het.
 
Hoe zie ik wie de 'parent' is van label1? Als ik 'm aanwijs met de muis komt er 'Label KoppelingTaskpane.label1' te staan. Kan het zijn dat het scherm opnieuw geladen wordt waardoor deze code weer gerund wordt?
Code:
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(16, 79);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(35, 13);
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            this.label1.Click += new System.EventHandler(this.label1_Click);

Denk het niet he...? Ben het kwijt...
 
Wampier, in ieder geval bedankt voor je hulp! Super!

Ik ben erachter wat er gebeurd. Zodra de code uit 'Propchange' komt wordt KoppelingTaskpane opnieuw 'geladen' oid... BV: ik maak string str2 aan en stel deze in Propchange gelijk aan str. str is dan "Henk 2" dus str2 is ook "Henk 2". Zodra ik uit Propchange kom is str2 weer leeg. Of "1" als ik hem zo definieer: public string str2 = "1". Dat is dus het probleem...

Hoe los ik dit nu op?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan