5 Replies Latest reply: Jul 18, 2014 1:36 AM by prabhu appu RSS

    Get objects used in a container using OCX in C#?

    prabhu appu

      Hi,

       

      I'm trying to get the list of objects used in a container object using C#.

       

      But there is no GetProperties() function for SheetObjects in OCX library.

       

      i found the below code to set the container objects using vb Macro. it has a method to get the contained objects.

       

      Is there any method to achieve this in C#?

       

      Set ContainerObj = ActiveDocument.Sheets("Main").CreateContainer
      set ContProp=ContainerObj.GetProperties
       ContProp.ContainedObjects.Add 
       ContProp.SingleObjectMode=1
       ContProp.SingleObjectStyle=1
       ContProp.ShowObjectTypeIcons=true
       ContProp.ContainedObjects.Add 
       ContProp.ContainedObjects.Item(0).Id = "Document\CH03"
       ContProp.ContainedObjects.Item(0).Text.v = "Bar"
       ContProp.ContainedObjects.Add
       ContProp.ContainedObjects.Item(1).Id = "Document\CH01"
       ContProp.ContainedObjects.Item(1).Text.v = "Mekko"
      ContainerObj.SetProperties ContProp
      
      

       

      Thanks in Advance.

        • Re: Get objects used in a container using OCX in C#?
          Jeff Koch

          Hi,

           

          Here is a routine I wrote for one of my customer to create a container object and populate it.  It is a VB.Net snippet and you should be able to use the same object reference to get the object id’s of the objects in the container then use those to get the object’s properties.

           

          Regards,

          Jeff

           

              Private Sub addObjectToContainer()

                  Dim ListboxObj As QlikView.ListBox

                  Dim LBProp As QlikView.IListBoxProperties

                  Dim LBID As String

           

                  Dim Fields(6) As String

           

                  Dim ContainerObj As QlikView.Container

                  Dim ContProp As QlikView.IContainerProperties

                  Dim ContFrame As QlikView.IFrame

                  Dim i As Integer

           

                  '[ init field list of Data model fields we want in list boxes

                  Fields(0) = "Customer"

                  Fields(1) = "Salesman"

                  Fields(2) = "Distributor ID"

                  Fields(3) = "Product ID"

                  Fields(4) = "Country"

                  Fields(5) = "Year"

           

                  '[ Initialize the container

                  ContainerObj = AxQlikOCX1.ActiveDocument.Sheets("Main").CreateContainer

                  ContProp = ContainerObj.GetProperties

                  ContProp.Frame.Name.v = "Selections"

                  ContProp.SingleObjectMode = 1

                  ContProp.SingleObjectStyle = 1

                  ContProp.ShowObjectTypeIcons = True

           

                  '[ actiate the sheet we want the container on  (sheet name is case sensitive)

                  AxQlikOCX1.ActiveDocument.Sheets("Main").Activate()

           

                  '[ create the listbox, add it to the container, then close the listbox out (delete it)

                  For i = 0 To 5

                      '[ create the list box and set properties

                      ListboxObj = AxQlikOCX1.ActiveDocument.Sheets("Main").CreateListBox

                      LBID = ListboxObj.GetObjectId

                      LBProp = ListboxObj.GetProperties

                      LBProp.Def.Name = Fields(i)

                      LBProp.Def.Type = 1 '[ field

                      ListboxObj.SetProperties(LBProp)

           

                      '[ add the listbox to the container

                      ContProp.ContainedObjects.Add()

                      ContProp.ContainedObjects.Item(i).Def.ObjectId = LBID

                      ContProp.ContainedObjects.Item(i).Text.v = Fields(i)

           

                      '[ remove the newly created list box from the sheet but leave the copy in the container object

                      ListboxObj.Close()

                  Next

           

                  '[ set the container properties

                  ContainerObj.SetProperties(ContProp)

           

                  '[ Set container position and size

                  Dim rect As QlikView.IRect

                  rect = ContainerObj.GetRect

                  rect.Left = 2

                  rect.Top = 170

                  rect.Width = 274

                  rect.Height = 300

                  ContainerObj.SetRect(rect)

           

              End Sub

            • Re: Get objects used in a container using OCX in C#?

              Hi Jeff,

              In slight variations of the above code, I'm trying to loop through the objects in a container and export them to Excel, but QV does not seem to like that.  Any suggestions on looping through the objects in a container and making this work?  I get an invalid FOR loop variable error.. Thanks in advance!!

               

              For i = 1 To ActiveDocument.NoOfSheets -2

                   Set MySheet = ActiveDocument.GetSheet(i)

                   MySheet.Activate 

                   contCharts=MySheet.GetSheetObjects

               

                    For X =lbound(contCharts) to ubound(contCharts) 

                    Set obj = ActiveDocument.GetSheetObject(contCharts(X).GetObjectId)

               

              IF obj.GetObjectType = 36 then

                    Set ContProp=obj.GetProperties

                   Msgbox ContProp.ContainedObjects.Count   'it displays the count of objects correctly but it errors out in the next line below..

               

                  For i = 0 to ((ContProp.ContainedObjects.Count) -1)

                   ' export only the object types 10 to 16

                   IF ContProp.ContainedObjects.Items(i).GetObjectType >= 10 AND ContProp.ContainedObjects.Items(i).GetObjectType =< 16 Then

                        ContProp.ContainedObjects.Items(i).CopyValuesToClipboard true

               

                        Msgbox ContProp.ContainedObjects.Items(i).GetCaption

              '      End if

               

                    Next

              End if

              Next

                • Re: Get objects used in a container using OCX in C#?

                  Where do I find the properties and methods of ContainedObjects member? I cant find any in the user manual, nor much information in the API guide.  Get the error that -

                  Object doesn't support this property or method: 'ContProp.ContainedObjects.Items'


                  • Re: Re: Get objects used in a container using OCX in C#?
                    prabhu appu

                    Hi Nithya,

                     

                    When copy the values to clipboard of contained objects, you need to activate the object.

                     

                    but i couldn't see any function to activate the container object. So what i did is, i have created a copy of the object in a new sheet and then copied the values to clipboard (and don't forget to delete the newly created object before saving the application). Please find the below code for creating a copy of that object,

                     

                    if (objecttype.Contains("Container"))
                                    {
                                        QlikView.SheetObject QlikObject = (QlikView.SheetObject)Obj;
                                        QlikView.Document QlikDoc = (QlikView.Document)Doc;
                                        createobject(QlikDoc, QlikObject);
                                       
                                        //Clipboard.Clear();
                                    }
                    

                     

                     

                    QlikView.Graph ObjectType14 = (QlikView.Graph)obj;
                                        ObjectType14.WriteXmlPropertiesFile("Filename" + obj.GetObjectId().Replace("\\","") + ".xml");
                    

                     

                    doc.CreateSheet().CreateObjectFromXmlPropertiesFile(filename);
                    

                     

                    before copying the value or image to clipboard you need to activate that sheet and object,

                     

                     if (objecttype.Contains("Container"))
                                    {
                                        var ContainerObj = Doc.GetSheetObject(listView1.SelectedItems[0].SubItems[2].Text.Replace("Container\\",""));
                                        ContainerObj.GetSheet().Activate();
                                        ContainerObj.Activate();
                                        ContainerObj.CopyTableToClipboard(true);
                                    }
                                    else
                                    {
                                        Obj.Activate();
                                        var docalias = (QlikView.Document)Doc;
                                        docalias.GetSheetObject(objectid).CopyTableToClipboard(true);
                    
                    
                                    }
                    

                     

                    Regards,

                    Prabhu Appu

                  • Re: Re: Get objects used in a container using OCX in C#?
                    prabhu appu

                    Hi Jeff,

                     

                    Thanks for the reply...

                     

                    i used the below code to get the object IDs of the contained object.

                     

                              if (Sheets.SheetObjects(i.ToString()).GetObjectType() == 36)
                                    {
                                        var Obj = (QlikView.Container)Doc.GetSheetObject(objectid);
                                        var containerObjs = Obj.GetProperties().ContainedObjects;
                                        for (int j = 0; j < containerObjs.Count; j++)
                                        {
                                            var ContainedObjId=containerObjs[j].Id_OBSOLETE;
                                            var Def = containerObjs[j].Text;
                                            string[] row = { ContainedObjId.Replace("Document\\", ""), Def.v, "Container " + objectid };
                                            var listViewItem = new ListViewItem(row);
                                            listView1.Items.Add(listViewItem);
                                         }
                                    }
                    

                     

                    Regards

                    Prabhu Appu