Page 1 of 1

Edit control properties by string name

Posted: Thu Nov 22, 2012 6:43 am
by Chris
Hi,

i don't know if this thread's title is perfect for my question but here we go:

I've got several Text controls on my Screen and would like to know if it's possible to edit their displayed text by just having their name in a string variable.

I mean s.th. like mark.monroe posted in this thread http://ixtalk.beijerelectronics.us/view ... 1149#p1149 but only for Text controls.

i tried to do it like this:

Code: Select all

		private Neo.ApplicationFramework.Controls.Script.TextControlCFAdapter FindControlByName(string name)
		{
			foreach (Neo.ApplicationFramework.Controls.Script.TextControlCFAdapter c in this.Controls) 
			{
				if (c.Name == name)
					return c;
			}
			return null; 
		}
Do you have any idea how one could do that?

Thanks
but it's not working..

Re: Edit control properties by string name

Posted: Fri Mar 15, 2013 3:26 am
by Edmund
Hello Chris!

Not completely sure of what control you mean with TextControlCFAdapter, but maybe you can make something out of this.

Here is a little example I put together.

I the screen there is three buttons.

Button 1 will toggle the visibility of the two other.

Button 2 is hidden at screen opened event.

Button 3 is visible from start.

By finding the buttons via their names we can control them.

Code: Select all

namespace Neo.ApplicationFramework.Generated
{
    using System.Windows.Forms;
    using System;
    using System.Drawing;
    using Neo.ApplicationFramework.Tools;
    using Neo.ApplicationFramework.Common.Graphics.Logic;
    using Neo.ApplicationFramework.Controls;
    using Neo.ApplicationFramework.Interfaces;
	using System.Collections;
	using System.Windows;
    
    public partial class Screen2
    {
		void Screen2_Opened(System.Object sender, System.EventArgs e)
		{
			Button2.Visible = false;
		}
						
		
		void Button1_Click(System.Object sender, System.EventArgs e)
		{
			ToggleButtonVisibility("Button2");
			ToggleButtonVisibility("Button3");
		}
		
	
		public void ToggleButtonVisibility (string buttonName)
		{
			System.Collections.Generic.List<Neo.ApplicationFramework.Controls.Button> buttons = GetLogicalChildCollection<Neo.ApplicationFramework.Controls.Button>(this);		
			foreach (Neo.ApplicationFramework.Controls.Button button in buttons)
				    if(button.Name == "m_" + buttonName)
					    if(button.IsVisible)
						    button.Visibility = System.Windows.Visibility.Hidden;
					    else
						    button.Visibility = System.Windows.Visibility.Visible;	
		}
	


		public static System.Collections.Generic.List<T> GetLogicalChildCollection<T>(object parent) where T : DependencyObject
		{
			System.Collections.Generic.List<T> logicalCollection = new System.Collections.Generic.List<T>();
			GetLogicalChildCollection(parent as DependencyObject, logicalCollection);
			return logicalCollection;
		}
		
		private static void GetLogicalChildCollection<T>(DependencyObject parent, System.Collections.Generic.List<T> logicalCollection) where T : DependencyObject
		{
			IEnumerable children = LogicalTreeHelper.GetChildren(parent);
			foreach (object child in children)
			{
				if (child is DependencyObject)
				{
					DependencyObject depChild = child as DependencyObject;
					if (child is T)
					{
						logicalCollection.Add(child as T);
					}
					GetLogicalChildCollection(depChild, logicalCollection);
				}
			}
		}
    }
}


Please note that iX adds "m_" to the name of each control (good practice when declaring member variables to a class).

Re: Edit control properties by string name

Posted: Sat Apr 06, 2013 6:34 am
by buhl
Hello

I was looking for exactly this, but sadly this only works for projects target PC and I'm working on a project for T15B. I want to find a control by searching for its name.

When I compile the example, I get the following error:

The type or namespace name could not be found (are you missing an assembly reference?)

What do you propose, to solve this problem?

Jacob Buhl
Alfa Laval

Re: Edit control properties by string name

Posted: Mon Apr 08, 2013 8:59 am
by Edmund
Well yes the example only works with the full .Net Framework (WPF, PC-Target), and I havent found any good ways to do it for the Compact Framework (CE, Panels).

What you could do is adding the controls to a Array or List that you search in and updates if the object exsits...

Re: Edit control properties by string name

Posted: Mon Apr 08, 2013 12:16 pm
by buhl
Can you please explain that some more because I can't see how I can add them if i can't find them by their name?

I don't know how many object I have on the page because I auto generate them. But in run time I need to rearrange them depending on if some are disabled and therefore not visible. I know that the names are A1, A2, A3 A3 etc.
That is why I wanted to search for the component and loop this while there a component existed with that name.

Re: Edit control properties by string name

Posted: Mon Apr 08, 2013 12:40 pm
by buhl
Normally you would use this function in Compact Framework to locate a control by its name but it does not work.

private Control FindControl(Control parent, string ctlName)
{
foreach(Control ctl in parent.Controls)
{
if( ctl.Name.Equals(ctlName))
{
return ctl;
}
FindControl(ctl, ctlName);
}
return null;
}

Re: Edit control properties by string name

Posted: Thu Jan 25, 2018 4:55 am
by andrea
Hi Edmund,

I have tried something similar to what you suggest but Ihave problems on some aspects because our screens have a lot of controls on it and also Background/Parent Screen.

For example suppose that we have Button1 on the actual screen (example named: Screen1) but also Button1 in the Background Screen (example named: Background_Screen1).

I only would like to change the properties of visibility of Screen1.Button1 not for the Background screen's Button1. How to obtain that?

Thank you