Hallo,
wie aus dem Thread-Titel bereits hervorgeht, versuche ich momentan ein "Custom List Control" ähnlich diesem
Beispiel aus der MSDN zu schreiben. In diesem "Custom List Control möchte ich dann ein weiteres Control (setzt sich aus einer Checkbox und einer Textbox zusammen) laden. Das Control soll sich dann später selbst in eine HTML-Tabelle rendern. Eingebettet in eine aspx-Seite soll es dann wie folgt aussehen:
<uc1:CheckboxTextboxList ID="liste" runat="server">
<uc1:AnswerItem CheckBoxText="Antwort 1:" runat="server" />
<uc1:AnswerItem CheckBoxText="Antwort 2:" runat="server" />
</uc1:CheckboxTextboxList>Und hier sind noch die Klassen, die ich dazu erstellt habe:
Klasse AnswerItem
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
using System;
namespace feedbackmanagement.CustomerControls.Answers
{
[
TypeConverter(typeof(ExpandableObjectConverter))
]
public class AnswerItem : CompositeControl
{
private CheckBox _checkBox;
private TextBox _textbox;
private RequiredFieldValidator _answerBoxValidator;
#region "Properties"
[
Bindable(true), Category("Appearance"), DefaultValue(""), Description("")
]
public string CheckBoxText
{
get
{
EnsureChildControls();
return _checkBox.Text;
}
set
{
EnsureChildControls();
_checkBox.Text = value;
}
}
[
Bindable(true), Category("Appearance"), DefaultValue(""), Description("")
]
public string TextBoxText
{
get
{
EnsureChildControls();
return _textbox.Text;
}
set
{
_textbox.Text = value;
}
}
#endregion
#region "Überschriebene Properties"
//public override ControlCollection Controls
//{
// get
// {
// EnsureChildControls();
// return base.Controls;
// }
//}
#endregion
#region "Überschriebene Methode"
protected override void RecreateChildControls()
{
EnsureChildControls();
}
protected override void CreateChildControls()
{
Controls.Clear();
_checkBox = new CheckBox();
_checkBox.ID = "cbAnswer";
_textbox = new TextBox();
_textbox.ID = "txtAnswerBox";
_answerBoxValidator = new RequiredFieldValidator();
_answerBoxValidator.ID = "rvAnswerTextBox";
_answerBoxValidator.Display = ValidatorDisplay.Dynamic;
_answerBoxValidator.ControlToValidate = _textbox.ID;
_answerBoxValidator.InitialValue = String.Empty;
_answerBoxValidator.Text = "*";
this.Controls.Add(_checkBox);
this.Controls.Add(_textbox);
this.Controls.Add(_answerBoxValidator);
}
protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_checkBox.RenderControl(writer);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
_textbox.RenderControl(writer);
_answerBoxValidator.RenderControl(writer);
writer.RenderEndTag();
}
#endregion
}
}Klasse CheckboxTextboxList
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Collections;
using System.ComponentModel;
using System.Drawing.Design;
using System.Security.Permissions;
namespace feedbackmanagement.CustomerControls.Answers
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
DefaultProperty("AnswerItem"),
ParseChildren(true, "AnswerItem"),
ToolboxData("<{0}:CheckboxTextboxList runat=\"server\"> </{0}:CheckboxTextboxList>")
]
public class CheckboxTextboxList : WebControl
{
private ArrayList answerList;
[
Category("Behavior"),
Description("The contacts collection"),
Editor(typeof(AnswerCollectionEditor), typeof(UITypeEditor)),
PersistenceMode(PersistenceMode.InnerDefaultProperty)
]
public ArrayList AnswerItem
{
get
{
if (answerList == null)
{
answerList = new ArrayList();
}
return answerList;
}
}
protected override void RenderContents(
HtmlTextWriter writer)
{
Table t = CreateContactsTable();
if (t != null)
{
t.RenderControl(writer);
}
}
private Table CreateContactsTable()
{
Table t = null;
if (answerList != null && answerList.Count > 0)
{
t = new Table();
foreach (AnswerItem item in answerList)
{
AnswerItem aItem = item as AnswerItem;
if (aItem != null)
{
TableRow r = new TableRow();
r.Controls.Add(aItem);
t.Controls.Add(r);
}
}
}
return t;
}
}
}Klasse AnswerCollectionEditor
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.Design;
namespace feedbackmanagement.CustomerControls.Answers
{
public class AnswerCollectionEditor : CollectionEditor
{
public AnswerCollectionEditor(Type type)
: base(type)
{
}
protected override bool CanSelectMultipleInstances()
{
return false;
}
protected override Type CreateCollectionItemType()
{
return typeof(AnswerItem);
}
}
}Dabei habe ich jetzt mehrere Probleme:
1. Das Control wird in der Entwurfsansicht nicht richtig dargestellt.
2. Problem 2 resultiert aus dem 1. Problem. In der Entwurfsansicht kann ich den CollectionEditor nicht aufrufen.
3.
uc1:AnswerItem soll sich nur innerhalb von
uc1:CheckboxTextboxList aufrufen lassen. Genau das funktioniert aber nicht.
Ich hantiere zum ersten Mal mit CustomControls herum und weiß momentan nicht, wo ich am besten ansetzen kann oder wo der Fehler liegt.
Vielen Dank für eure Mühe!