Custom Control & Toolbox Tab - c#

I am creating a user interface and I am trying to figure out the best way to organize all of my custom controls.
I already know that I can do the following:
1) If I want to have a property visible for design-time manipulation via the Properties window, I use the following...
[Browsable(true)]
[Description("Text for Display"), Category("Custom Properties")]
public string DisplayText
{
get
{
return textDisplay.DisplayText;
}
set
{
textDisplay.DisplayText = value;
}
}
2) If I want to hide the control from the Toolbox window, I can use the following...
[ToolboxItem(false)]
public class TStrategyInput : FlickerControl
{
}
The final thing that I am trying to do is to specify the Tab (i.e. category) that my custom control comes up under in the Toolbox window - does anyone have any suggestions? Are there any other tricks out there for handling custom controls?
Thanks in advance!
William

Take a look at this MSDN Walkthrough:Autoloading Toolbox Items.
From above:
The recommended way to add custom controls to the Toolbox is to use
the Toolbox Control templates that come with the Visual Studio 10 SDK,
which include auto-loading support. This topic is retained for
backward compatibility, for adding existing controls to the Toolbox,
and for advanced Toolbox development.
Looking at the Window Forms Toolbox Control that above walkthrough mentions:
[ProvideToolboxControl("General", false)]
public partial class Counter : UserControl

Related

How to design a TabPage without TabControl?

I am trying to design some "standalone" tab-pages and later on, I want to add them dynamically to a tab-control in my main form. Visual Studio won't let me open the class extended with TabPage in the designer. Some idea?
using System;
using System.Windows.Forms;
namespace Test.View.Panels {
public class MainStatusTabPage : TabPage {
public MainStatusTabPage() {
}
}
}
When I right-click the class in the Solution Explorer and selecting "View Designer", I get the following message (the Designer doesn't show up):
To add components to your class, drag them from the Toolbox and use
the Properties window to set their properties. To create methods and
events for your class, switch to code view.
When I right-click the class in the Solution Explorer and selecting "View Designer", I get the following message (the Designer doesn't show up):
To add components to your class, drag them from the Toolbox and use the Properties window to set their properties. To create methods and events for your class, switch to code view.
This is normal behavior as a TabPage is just a container that holds other controls, nothing more. As #PanagiotisKanavos mentioned above:
A Tab Page is a container, not the actual content of the tab. In all examples that use complex content you'll see that the content is a custom component, eg a User control, that's added into the tab
With this in mind, you can just create a UserControl with all the other controls you would need and then add this new instance (UserControl) to the TabPage itself.

Visual Studio Form Designer Showing List of Controls

I know that getting the Form Designer to work is a ticklish business. Generics, x64, subtle problems with the project's XML... But perhaps someone can offer advice about my current problem, which is that a component I created that inherits from TabPage, when I try to view it in the designer shows up as a list of its controls, like this:
Thanks in advance.
You cannot make a TabPage as root of the designer, while you can do the same for a Panel or other container controls. The limitation is because, TabPage can only be hosted in TabControl, not even in the overlay control of the designer:
TabPage cannot be added to a
'System.Windows.Forms.Design.DesignerFrame+OverlayControl'. TabPages
can only be added to TabControls.
A control can be shown as root of the designer when the base class of the control has designer of type of DocumentDesigner. Form and UserControl are such controls which means when you create a new Form1:Form or new UserControl1:UserControl, since the base class derived from a designable control, then the class can be edited in the designer as root.
I believe you can handle your requirement by using UserControl, but for learning purpose (or as a workaround) if you want to make a control deriving from Panel designable, you can copy the following code in a code file:
public class MyControl: MyDesignableControl
{
}
[Designer(typeof(DocumentDesigner), typeof(IRootDesigner))]
public class MyDesignableControl : Panel
{
}
Then save it and then double click on it and you can see you can design it like a root control.
Then after you done with the design, change the Panel to TabPage.
Remarks on
DocumentDesigner
This designer is a root designer, meaning that it provides the
root-level design mode view for the associated document when it is
viewed in design mode.
You can associate a designer with a type using a
DesignerAttribute.
For an overview of customizing design time behavior, see Extending
Design-Time
Support.

Showing public fields of a UserControl in designer

I am trying to add some fields to a custom UserControl that I am making. I have some fields that I like them to be visible in the Properties window of Visual Studio. I tried to use the flags below but I dont see the field in the designer, even after a compile.
How should I do this correctly?
public partial class TosChartControl: UserControl
{
#region PUBLIC FIELDS
[Browsable(true)] //Added this but still does not show up
[Category("Data")]
[DefaultValue(0)]
[Description("ID of the Sensor Node")]
public int NodeId { get; set; }
#endregion
public TosChartControl()
{
InitializeComponent();
}
}
I did clean and rebuild the soloution and projects but I cant still see this field in Properties window. Even restarting the Visualstudio didnt help.
UPDATE: Your public properties are visible in the designer only when it's in another control in the designer. It turns out that you don't need to add this attribute, properties are visible by default in the designer. As far as I understand, when it's in another component's design view, an instance of the user control is created and properties can be shown. Sorry for misleading you in the beginning, I thought it was necessary to add it.
Try this attribute:
[Browsable(true)]
http://msdn.microsoft.com/en-us/library/system.componentmodel.browsableattribute.aspx
To elaborate on henginy's updated answer:
Be sure that you are looking at an instance of the control you want to modify properties for, and not the definition of the control itself.
To clarify, when you add a property to your TosChartControl class, you won't see the property in the TosChartControl.cs [Design] tab, you will see it where you implement a TosChartControl, such as your Form1.cs [Design] tab, e.g. the containing control to which you have added your custom control.
...Assuming that your Properties window is visible, and that you have the control selected.
What to take away from this lesson:
Understanding what the properties window is actually showing you — It's contextual.
The difference between the model and the implementation of the model — e.g. Designing the custom control and designing the form that uses the custom control.

How to create new components in Visual Studio 2010

Can you tell me how to create new visual component for .net 4.0 in Visual Studio 2010,
i have a book about component creation in Russian Language (Pavel Agurov -Razrabotka Komponentov v MS Visual Studio 2005/2008), but methods in this book covers VS 2005 and 2008. And methods gives some errors in VS 2010.
EDIT:
There is my code
public partial class exComboBox : ComboBox
{
/*public exComboBox()
{
InitializeComponent();
}*/
private System.Collections.Specialized.StringCollection _itemValues = new System.Collections.Specialized.StringCollection();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.StringCollectionEditor,System.Editor","System.Drawing.Design.UITypeEditor,System.Drawing")]
public System.Collections.Specialized.StringCollection ItemValues
{
get
{
return _itemValues;
}
set
{
_itemValues = value;
}
}
public object SelectedItemValue
{
get
{
return _itemValues[SelectedIndex];
}
}
}
And when I try to add this component to new form and add values for ItemValues it says
Constructor on type 'System.String' not found.
Right click your project, choose to add a new item. Go to the C# section and select User Control.
This will create a windows control that will appear at the top of the Toolbox when you use the forms designer. Just drag and drop it into your form like any other control.
If you wish to derive it from Combo Box, then just edit the class that is created and change it's base class from a UserControl to a combo box. You might also need to change your constructor top call three base class constructor rather than doing InitialiseComponent for itself.
If you want to use this control in many applications, then you can put the code into a Class Library project, which will make a .dll assembly that other projects can reference to gain access to the control.
Create a Windows Application and then go to Add New Item menu by right clicking on Project in Solution Explorer and you can see there the Component AFAIR.
Assuming you're talking about Winforms...
Deriving from existing controls is probably not something you'll want to do. Especially if you want to change their default behavior or replace their existing properties. Sooner or later you will be facing severe limitations. Believe me, I've been there.
If you want an easy way to repeat some kind of pattern for a ComboBox, I suggest you take a look at IExtenderProvider interface. You can implement it on a Component-derived class that you can drag on the design surface. In this component, you can declare properties that will be attached as extra properties to any comboboxes (or anything else, it's all up to you).
Since the component will know about whatever is attached to it, it will be able to declare event handlers over any attached control / component. For example, if you want your combobox to have items already present, you could handle it's Load event and add the items there.
To learn more about IExtenderProvider, go here.

How to hide certain set of WPF controls showing up in Visual Studio Toolbox?

The ToolboxItem(false) works for Winforms controls.
ToolboxBrowsable(false) does not work for the WPF controls.
[ToolboxBrowsable(false)]
public class MyControl : UserControl
{
}
The MyControl even with ToolboxBrowsable(false) shows up in the Visual Studio toolbox.
What am I doing wrong?
-Datte
The [ToolboxBrowsable(false)] attribute does not have any effect within the same solution.
This is because you might want to be able to use the control in any forms within that solution.
If you compile the class library, remove it from the solution and add a reference to it you should see the control disappearing from the toolbox.

Categories