Avatar billede burningice Nybegynder
25. april 2004 - 21:50 Der er 1 kommentar og
1 løsning

DataBind() blive kaldt før set_DataSource ?

I forbindelse med at jeg satte mig for at udvide DropDownListen lidt så jeg selv kunne overtage DataBind-metoden er jeg stødt ind i en, for mig, lidt besynderlig opdagelse.

Jeg har overridet DataBind-metoden, så den tager DataSource-objectet (som i mit tilfælde er en collection), og tilføjer et ListItem for hver item i datasourcen. Jeg blev dog ved med at få en null-reference exception, hvilket jeg ikke kunne forstå... jeg havde da sat min datasource før jeg kaldte DataBind().

Efter lidt debugging gik det op for mig, at min DataBind blev kaldt FØR min datasource blev sat, hvilket for mig virker meget ulogisk? Indtil videre har jeg fået løst problemet med at flytte min kode fra DataBind() op i set_DataSource.

Mit spørgsmål er så, om dette er helt normalt, eller om det er mig der har gjort noget galt et sted?

Min klasse ser sådan her ud:

using System;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace Dobedogz.com.WebControls
{
    /// <summary>
    /// Summary description for ColorPicker.
    /// </summary>
    public class ColorPicker : System.Web.UI.WebControls.DropDownList
    {
        private Product dataSource;

        public ColorPicker() : base()
        {

        }

        public override object DataSource
        {
            get
            {
                return this.dataSource;
            }
            set
            {
                if (value is Product)
                {
                    this.dataSource = (Product)value;

                    foreach (Color c in this.dataSource.Colors)
                    {
                        this.Items.Add(new ListItem(c.Name, c.BaseColor.Hex));
                    }
                }
                else
                {
                    throw new ArgumentException("Datasource has to be a product");
                }
            }
        }

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            this.Attributes.Add("onChange", "chooseColor('"+ this.ClientID +"', this.options[this.selectedIndex].value)");
            base.Render (writer);
           
            HtmlInputText color = new HtmlInputText();
            color.ID = this.ClientID +":colorViewer";
            color.Disabled = true;
            color.Style.Add("background-color", "#CCCCCC");
            color.Style.Add("width", "30px");
            color.Style.Add("height", "18px");
            color.Style.Add("border", "1px solid white");
            color.RenderControl(writer);
        }
    }
}
Avatar billede burningice Nybegynder
25. april 2004 - 22:21 #1
hm... tror jeg har fundet ud af hvad der var galt... man skal åbenbart kalde base.OnDataBinding(EventArgs.Empty) før man begynder at bruge sin datasource i rendermetoden. Følgende ser i hvert fald ud til at virke:

using System;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace Dobedogz.com.WebControls
{
    /// <summary>
    /// Summary description for ColorPicker.
    /// </summary>
    public class ColorPicker : System.Web.UI.WebControls.DropDownList
    {
        private Product dataSource;

        public ColorPicker() : base()
        {

        }

        public override object DataSource
        {
            get
            {
                return this.dataSource;
            }
            set
            {
                if (value is Product)
                {
                    this.dataSource = (Product)value;
                }
                else
                {
                    throw new ArgumentException("Datasource has to be a product");
                }
            }
        }

        public override void DataBind()
        {
            // Evaluate any data-binding expressions on the control itself.
            base.OnDataBinding(EventArgs.Empty);
           
            foreach (Color c in this.dataSource.Colors)
            {
                this.Items.Add(new ListItem(c.Name, c.BaseColor.Hex));
            }
        }


        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            this.Attributes.Add("onChange", "chooseColor('"+ this.ClientID +"', this.options[this.selectedIndex].value)");
            base.Render (writer);
           
            HtmlInputText color = new HtmlInputText();
            color.ID = this.ClientID +":colorViewer";
            color.Disabled = true;
            color.Style.Add("background-color", "#CCCCCC");
            color.Style.Add("width", "30px");
            color.Style.Add("height", "18px");
            color.Style.Add("border", "1px solid white");
            color.RenderControl(writer);
        }
    }
}
Avatar billede burningice Nybegynder
26. april 2004 - 09:21 #2
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester