ASP.NET Zone

Die ASP.NET Community. Alle Antworten rund um Microsoft® Webtechnologien
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe | Impressum | ASP.NET Zone Suchplugin

in
Home Blogs Foren FAQ Communities Fotos Downloads
Werbeanzeige

CustomControl ähnlich einem ListControl erstellen

Letzter Beitrag 02-12-2010, 17:57 von Rene Drescher-Hackel. 7 Antworten.
Beiträge sortieren: Zurück Weiter
  •  02-09-2010, 23:35 215902

    CustomControl ähnlich einem ListControl erstellen

    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!
  •  02-10-2010, 18:38 215927 Antwort zu 215902

    AW: CustomControl ähnlich einem ListControl erstellen

    Wieso erweiterst nicht die CheckBoxList und hängst dich einfach in den Renderprozess rein - wäre doch einfacher  - oder?
    Gruss Rene
    ______________________________


    weblog.drescher-hackel.de

    HTTP Compression nutzen

    dotnet-forum.de

    .NET Framework 2.0 Web-based Client Development & .NET Framework Application Development Foundation
  •  02-10-2010, 22:26 215929 Antwort zu 215927

    AW: CustomControl ähnlich einem ListControl erstellen

    Also, wenn ich das richtig verstanden habe, brauche ich im Prinzip nur folgendes zu machen:

    - AnswerItem-Klasse so umschreiben (von WebControl abgeleitet), dass ich bspw. auf das "CheckboxText"-Property oder "TextboxText"-Property zugreifen kann und in der Render-Methode die entsprechenden HTML-Elemente implementiere.

    Aber wie kann ich dann der CheckboxList mitteilen, dass nur AnswerItems hinzugefügt werden dürfen? Meinst du das mit "erweitern"? Wenn ja, kannst du mir da einen Tipp geben, wie es funktioniert?
  •  02-10-2010, 23:27 215931 Antwort zu 215929

    AW: CustomControl ähnlich einem ListControl erstellen

    Du leitest deine Klasse am besten von CheckBoxList ab

    public class CustomCheckBoxList : System.Web.UI.WebControls.CheckBoxList

    Dann kannst du in der Methode RenderControl

            public override void RenderControl(HtmlTextWriter writer)
            {
                foreach (ListItem item in this.Items)
                {

                }
            }

    durch deine ItemsCollection itterieren und dann die Text-Eigenschaft verarbeiten und den Renderprozess des Controls manipulieren.

    base.RenderControl(writer) solltest allerdings nicht aufrufen Wink


    Gruss Rene
    ______________________________


    weblog.drescher-hackel.de

    HTTP Compression nutzen

    dotnet-forum.de

    .NET Framework 2.0 Web-based Client Development & .NET Framework Application Development Foundation
  •  02-11-2010, 11:35 215943 Antwort zu 215931

    AW: CustomControl ähnlich einem ListControl erstellen

    Ich habs. War mal wieder einfacher als ich dachte. Surprise

    using System;
    using System.Web.UI.WebControls;
    using System.Web.UI;
    using System.ComponentModel;
    namespace feedbackmanagement.CustomerControls.Answers
    {
        [
        DefaultProperty("TextboxText"),
        ToolboxData("<{0}:CustomCheckboxList runat=\"server\"> </{0}:CustomCheckboxList>")
        ]
        public class CustomCheckboxList : CheckBoxList
        {
            [
            Bindable(true),
            Category("Appearance"),
            DefaultValue("")
            ]
            public string TextboxText
            {
                get
                {
                    if (ViewState["TextboxText"] == null)
                    {
                        return String.Empty;
                    }
                    return (string)ViewState["TextboxText"];
                }
                set
                {
                    ViewState["TextboxText"] = value;
                }
            }
            protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
            {
                TextBox txtBox = new TextBox();
                txtBox.ID = repeatIndex.ToString();
                base.RenderItem(itemType, repeatIndex, repeatInfo, writer);
                writer.Write("</td> <td>");
                txtBox.RenderControl(writer);
            }
            protected override void Render(HtmlTextWriter writer)
            {
                base.Render(writer);
            }
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.Write(TextboxText);
            }
        }
    }


    Beim Debuggen bekomme ich allerdings noch folgenden Kompilierungsfehler:
    Compilerfehlermeldung:
    CS0433: Der Typ
    "feedbackmanagement.CustomerControls.Answers.CustomCheckboxList" ist
    sowohl in "c:\Users\Chabo\AppData\Local\Temp\Temporary ASP.NET
    Files\root\20c95a77\63c17fa4\assembly\dl3\ed0e29eb\fefdded0_03abca01\feedbackmanagement.DLL"
    als auch in "c:\Users\Chabo\AppData\Local\Temp\Temporary ASP.NET
    Files\root\20c95a77\63c17fa4\assembly\dl3\dd6f7a10\e4d992a0_03abca01\feedbackmanagement.CustomerControls.Answers.DLL"
    vorhanden.

    Ich hab schon versucht, beide Dateien zu löschen. Die werden aber bei jedem neuen Debug-Versuch wieder erstellt. im VS wird das Control richtig dargestellt.

    Was kann ich dagegen tun?

    Edit: Noch kurz eine Zwischenfrage: Ich möchte an eine Dropdownlist ein eigenes Objekt binden. Muss es sich dabei immer um ein DataSet handeln oder kann man das auch selbst festlegen? Tipps bzw. Tutorials wären auch hier hilfreich. Danke
  •  02-11-2010, 14:47 215953 Antwort zu 215943

    AW: CustomControl ähnlich einem ListControl erstellen

    xPlised:
    Edit: Noch kurz eine Zwischenfrage: Ich möchte an eine Dropdownlist ein eigenes Objekt binden. Muss es sich dabei immer um ein DataSet handeln oder kann man das auch selbst festlegen?

    du kannst eine Liste, DataTable, Dictionary binden


    Gruss Rene
    ______________________________


    weblog.drescher-hackel.de

    HTTP Compression nutzen

    dotnet-forum.de

    .NET Framework 2.0 Web-based Client Development & .NET Framework Application Development Foundation
  •  02-12-2010, 11:58 215986 Antwort zu 215953

    AW: CustomControl ähnlich einem ListControl erstellen

    ah, danke schön. Klappt bisher alles wunderbar.

    Ist nur noch das Problem mit dem Custom Control. Hast du da zufällig eine Lösung?

    Noch eine weitere Frage. Ich habe jetzt in der CustomCheckboxList für jedes ListItem eine zusätzliche Textbox. Leider wird das alles hintereinandergeklatscht, sieht sehr unschön aus. Ich würde jedoch die Spalten etwas verbreitern. Gibts da eine Möglichkeit?
  •  02-12-2010, 17:57 216004 Antwort zu 215986

    AW: CustomControl ähnlich einem ListControl erstellen

Als RSS Feed in XML ansehen
Powered by Community Server (Commercial Edition)