I was hoping to create a custom control whose template would only allow elements of a certain type. Below is an example of desired markup:
I've tried several different things but each method seems to have a limitation/flaw which prevents me from getting it to work. I don't make custom controls that often, and when I do, they have been relatively simple. One way that I have tried doing it is shown below, however wouldn't it basically require me to exhaustively set each of the properties and methods for the TextBox, DropDownList, etc?
By the way, I realize there are multiple ways that I can render the contents and I planned on making changes to that code, anyhow. Right now, I am more worried about the code/control structure and how to get it to parse correctly in markup.
If anyone could be of assistance, I would greatly appreciate your help. Thank you!
Code:
<cc1:EntityView runat="server">
<LabelledControls>
<cc1:LabelledTextBox runat="server" />
<cc1:LabelledTextBox runat="server" />
<cc1:LabelledDropDownList runat="server" />
<cc1:LabelledTextBox runat="server" />
</LabelledControls>
</cc1:EntityView>
I've tried several different things but each method seems to have a limitation/flaw which prevents me from getting it to work. I don't make custom controls that often, and when I do, they have been relatively simple. One way that I have tried doing it is shown below, however wouldn't it basically require me to exhaustively set each of the properties and methods for the TextBox, DropDownList, etc?
Code:
[ToolboxData("<{0}:EntityView runat=server></{0}:EntityView>")]
[ParseChildren(true)]
public class EntityView : WebControl
{
private Collection<LabelledControl> _LabelledControls = new Collection<LabelledControl>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Browsable(true)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public Collection<LabelledControl> LabelledControls
{
get { return _LabelledControls; }
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
public abstract class LabelledControl : WebControl
{
}
[ToolboxData("<{0}:LabelledTextBox runat=server></{0}:LabelledTextBox>")]
public class LabelledTextBox : LabelledControl
{
private Label _lbl = new Label();
private TextBox _txt = new TextBox();
private Unit _Width;
public String LabelText
{
get { return _lbl.Text; }
set { _lbl.Text = value; }
}
public String Text
{
get { return _txt.Text; }
set { _txt.Text = value; }
}
public override Unit Width
{
get { return _Width; }
set { _Width = value; }
}
public Unit LabelWidth
{
get { return _lbl.Width; }
set { _lbl.Width = value; }
}
public Unit TextBoxWidth
{
get { return _txt.Width; }
set { _txt.Width = value; }
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<span style=\"display: inline-block; width: " + _Width + "; border: 1px solid red;\"" + (String.IsNullOrWhiteSpace(CssClass) ? "" : "class=\"" + CssClass + "\"") + ">");
output.Write("<span style=\"float: left; vertical-align: bottom;\">" + _lbl.Text + ":" + "</span>");
_txt.Style["float"] = "right";
_txt.RenderControl(output);
output.Write("</span>");
}
}
[ToolboxData("<{0}:LabelledDropDownList runat=server></{0}:LabelledDropDownList>")]
public class LabelledDropDownList : LabelledControl
{
private Label _lbl = new Label();
private DropDownList _ddl = new DropDownList();
private Unit _Width;
public String LabelText
{
get { return _lbl.Text; }
set { _lbl.Text = value; }
}
public override Unit Width
{
get { return _Width; }
set { _Width = value; }
}
public Unit LabelWidth
{
get { return _lbl.Width; }
set { _lbl.Width = value; }
}
public Unit DropDownListWidth
{
get { return _ddl.Width; }
set { _ddl.Width = value; }
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<span style=\"display: inline-block; width: " + _Width + "; border: 1px solid red;\"" + (String.IsNullOrWhiteSpace(CssClass) ? "" : "class=\"" + CssClass + "\"") + ">");
output.Write("<span style=\"float: left; vertical-align: bottom;\">" + _lbl.Text + ":" + "</span>");
_ddl.Style["float"] = "right";
_ddl.RenderControl(output);
output.Write("</span>");
}
}
By the way, I realize there are multiple ways that I can render the contents and I planned on making changes to that code, anyhow. Right now, I am more worried about the code/control structure and how to get it to parse correctly in markup.
If anyone could be of assistance, I would greatly appreciate your help. Thank you!