Notifications
Clear all

[Closed] Dotnet TabControls dilema

Hi guys,

I have searched about trying to find an answer to this and a number of posts come close but not quite enough info for me to actually cope! I am trying to get a basic DOT NET tabcontrol to work, since my boss has insisted a new tool that I have written has one.

This is my attempt so far




--Destroy dialog if it already exists.
try(destroyDialog theRollout)catch()

--Create a rollout
rollout theRollout "The Rollout" width:300
(
	--Create the dotNet TabControl 
	dotNetControl tc "system.windows.forms.tabcontrol" height:200

	fn initTc thetc=
	(
        --Manually build 3 tab pages
        t1 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 1"
        t3 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 2"
        t2 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 3"

        --How do I then add controls to these tab pages!?!?
	--l1 = dotNetobject "System.Windows.Forms.Label"
	--l1.Text = "Moo"

	--t1.controls.add l1

	thetc.controls.add t1
	thetc.controls.add t2
	thetc.controls.add t3

	
	)
	
	on theRollout open do
	(
	initTc tc
	)

)
createDialog theRollout	


The above code creates a basic Tab Control with 3 tabpages really nicely. But I cannot figure out how to add any controls to any of the tab pages. The commented out code shows my attempts (and thought process), which is clearly wrong! I have seen other discussions mentioning sub rollouts, but I have tried creating separate rollouts and then adding them to the tabpages as subrollouts and I just keep getting errors!

MSDN shows examples of UI elements being added using the line:


t1.controls.add l1

where t1 is a tabpage and l1 is a simple UI element (say label)

Could anyone guide me in how to actually add UI elements to the separate TabPages! I would be really grateful. Examples or instruction more than welcome!

Thanks for your time everyone,

Rich

11 Replies

Hi guys,

Is the solution to hide and reveal subrollouts on a Tabcontrol clicked event, rather than trying to add the subrollouts to the Tabcontrol pages themselves?

Any milage in that approach…

Cheers

Rich

I found this piece of code on the .net thread some weeks ago. It creates some UI stuff inside the tab page. Not MAX rollouts, but I guess the command would be the same. Hope it’s useful


 (
  dotnet.loadassembly "System.Data" 
  
 Color = dotNetClass "System.Drawing.Color" 
 ScrollBars = dotNetClass "System.Windows.Forms.ScrollBars"
   
 -- Create Tabs Container 
  tabControl1 = dotnetobject "system.windows.forms.TabControl"
  tabControl1.size = dotnetobject "system.drawing.size" 395 195
  tabControl1.Location = dotnetobject "System.Drawing.Point" 0 0 
   
 --Create Tabs
  tabPage1 = dotnetobject "System.Windows.Forms.TabPage"
  tabPage1.text = "Goodbye World"
  tabPage2 = dotnetobject "System.Windows.Forms.TabPage"
  tabPage2.text = "Hello World"
  tabPage1.backColor = color.fromArgb 200 200 200 
  tabPage2.backColor = color.fromArgb 200 200 200 
   
 -- Add Some Columns to the Datagrid
  dt = dotnetobject "system.data.DataTable""Test"
  Column1 = dotnetobject "System.Data.DataColumn" "id" (dotnetclass "System.Int32")
  Column2 = dotnetobject "System.Data.DataColumn" "Name" (dotnetclass "System.String")
  dt.columns.add Column1
  dt.columns.add Column2
    
 for i=0 to 2 do 
 (
 	 row=#(dotnetobject "System.Int32" i,dotnetobject "System.String" (i as string)) 
 	 dt.rows.add row
  )
    
 -- Create Datagrid
  DGrid1 = dotnetobject "System.Windows.Forms.DataGrid"
  DGrid1.Location = dotNetObject "System.Drawing.Point" 10 10
  DGrid1.Width = 365
  DGrid1.Height = 120
  DGrid1.Visible = true
  DGrid1.DataSource = dt 
   
 -- Create TextBox
  TB1TextBox = dotNetObject "System.Windows.Forms.TextBox"
  TB1TextBox.Location = dotNetObject "System.Drawing.Point" 10 10
  TB1TextBox.Width = 365
  TB1TextBox.Height = 120
  TB1TextBox.Visible = true
  TB1TextBox.MultiLine = true
  TB1TextBox.ScrollBars = ScrollBars.Vertical
  TB1TextBox.AcceptsReturn = true
  TB1TextBox.AcceptsTab = true
  TB1TextBox.WordWrap = true
   
 -- Create Buttons
  
 button01 = dotnetobject "System.Windows.Forms.button"
  button01.text = "goodbye" 
 button01.Location = dotNetObject "System.Drawing.Point" 300 138
    
 -- Create Form
  TabForm = dotNetObject "System.Windows.Forms.Form"
  TabForm.Size = dotNetObject "System.Drawing.Size" 400 225
  TabForm.Text = "Title"
  TabForm.TopMost = true
  FormBorderStyle = dotNetClass "System.Windows.Forms.FormBorderStyle"
  TabForm.FormBorderStyle = FormBorderStyle.FixedDialog
  TabForm.ShowInTaskbar = false
  TabForm.MinimizeBox = true
  TabForm.MaximizeBox = false
  Tabform.helpbutton = true
   
 -- Add UI elements to Tabs
  tabpage1.controls.add(TB1textbox)
  tabpage1.controls.add(button01)
  tabpage2.controls.add(DGrid1)
   
 -- Add Tabs to Tab Container
  tabcontrol1.controls.add(tabpage1)
  tabcontrol1.controls.add(tabpage2)
  
  -- Add Tab Container to UI Form
  TabForm.Controls.Add(tabcontrol1)
  
 -- Show application Form
  TTApp = dotNetClass "System.Windows.Forms.Application"
  TTApp.Run TabForm
  
 )

By the way, in your script change:


 t1.controls.add l1 
 

for

t1.controls.add(l1)

It should work

 PEN

When ever i have used them I have just used add and remove rollouts as I have wanted to be able to use standard max script UI items as well. It works well but you need to manage the changing of the tabs instead of manging the code needed for dotNet.

Sorry to pipe in, but Paul and EverZen are right, I stole the idea from Bobo originally, who I think used it originally in the Deadline maxscript.

If you pop over to his site on script spot, you should be able to find some sample code.

Also do a search on the forum, I’ve replied to at least two questions on the subject…not very useful as I suggested exactly what I’ve suggested to you…why repeat what is great work…get it from the master himself.

Shane

Hi guys, thanks for the awesome set of replies.

Cheers Iker for digging up that code. It is really useful to see a broader application that ties in other Dot Net UI elements. I am definitely more confident after picking my way through that!

Paul and Shane, it was actually from bumping into another of your posts that got me to move in the subrollout direction. In this case adding and removing subrollouts has worked brilliantly and for my case it is better to stick to maxscript UI elements for most of the tool, since there is all the functionality that I need.

Much appreciated guys. Knowing these sorts of tricks are going to really help get some smoother UIs out. Really helpful stuff!

Thanks for your time,

Rich

For anyone that is interested this is how I addressed the final TabControl Code using the subrollout solution. I have used the MouseDown event and queried the index of the selected tab in order to know which rollouts to add and remove. This might not be the best way to do things, but it has worked for me so far.

The example is an adaption of the ActiveX example, but for DotNet. If it helps feel free to use it. If there is a better way to write it then feel free to comment too!

Thanks for everyones help




--Destroy dialog if it already exists.
try(destroyDialog theRollout)catch()


rollout firstRollout "Rollout 1" (
edittext edittext01 text:"This is just a test." height:135 width:262 )

rollout secondRollout "Rollout 2" (
listbox listbox02 items:#("Line One","MAXScript Rocks","DotNet Too") width:260 )

rollout thirdRollout "Rollout 3" (
listbox multilistbox02 items:#("Option1","Option2","Option3") width:260 )



--Create a rollout
rollout theRollout "The Rollout" width:300
(
	--Create the dotNet TabControl control
dotNetControl tc "system.windows.forms.tabcontrol" height:25

--Create our subrollout that we can use to hide and reveal our different rollout choices
subRollout theSubRollout height:200

--Create a setup function for the DOT Net elements
fn initTc thetc=
	(
	--Create 3 Tab Pages
    t1 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 1"
    t2 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 2"
    t3 = dotNetObject "System.Windows.Forms.TabPage" "Tabpage 3"

        --Add the rollout to be initialise on the first Tabpage
   	addSubRollout theSubRollout  firstRollout height:200

        --Add the Tabpages to the TabControl
	thetc.controls.add t1
	thetc.controls.add t2
	thetc.controls.add t3
	)
	
	on tc mousedown arg do
		(	
                --Check which Tab is selected, and reveal the appropriate rollouts! 	
		case tc.SelectedTab.TabIndex of
		(
		0:
			(
			try
				(
				removeSubRollout theSubRollout secondRollout
				removeSubRollout theSubRollout thirdRollout
				)
			catch()

   			addSubRollout theSubRollout  firstRollout height:200
			)
		1:
			(
			try
				(
				removeSubRollout theSubRollout firstRollout
				removeSubRollout theSubRollout thirdRollout
				)
			catch()

   			addSubRollout theSubRollout secondRollout height:200
			)
		2:
			(
			try
				(
				removeSubRollout theSubRollout firstRollout
				removeSubRollout theSubRollout secondRollout
				)
			catch()

   			addSubRollout theSubRollout thirdRollout height:200
			)
		)

		)--End if mousedown

	on theRollout open do
	(
	initTc tc
	)

)
createDialog theRollout	height:230




Have fun…

 JHN

Thanks! Great stuff!

files snippet in local inspiration folder

-Johan

 PEN

That is just about what I have done, I think it is the best way if you want to be able to use standard Max controls as well as DotNet.

Page 1 / 2