Avatar billede keenkbh Nybegynder
03. december 2008 - 18:38 Der er 10 kommentarer og
1 løsning

Custom Control vil ikke render

Hej alle,

Jeg har siddet og leget lidt med at opbygge en simpel control, et grdview med tilhørende knapper.

Problemet er bare, at jeg ikke kan controllen frem på min side.

min control class:
public class KeenGrid : WebControl
    {
        private PlaceHolder cPlace = new PlaceHolder();
        private GridView cGrid = new GridView();
        private MySqlConnection con;
        private Button cUpdate = new Button();
        private Label cMsg = new Label();
       
        public KeenGrid()
        {
            con = new MySqlConnection("connection string");
        }

        public KeenGrid(MySqlConnection pCon)
        {
            this.con = pCon;
        }

        private void FillBasket()
        {
            DataSet mDataSet = new DataSet();
            MySqlDataAdapter mData = new MySqlDataAdapter(SQL, con);
            mData.Fill(mDataSet);
            cGrid.DataSource = mDataSet;
            cGrid.DataBind();
        }

        protected void cUpdate_Click(object sender, EventArgs e)
        {
            cMsg.Text = "Update udført";
            cGrid.DataSource = null;
            cGrid.DataBind();
        }       

        protected override void OnInit(EventArgs e)
        {
            InitializeControls();
            base.OnInit(e);
        }

        private void InitializeControls()
        {
            //Set basic settings.
            cGrid.AutoGenerateColumns = true;
            cGrid.Visible = true;

            cUpdate.Click +=new EventHandler(cUpdate_Click);
        }

        protected override void CreateChildControls()
        {
            BuildControlHierachy();

            if (!Page.IsPostBack)
            {
                DataBind();
                FillGrid();
            }

            base.CreateChildControls();
        }

        private void BuildControlHierachy()
        {
           
            Controls.Add(cPlace);
           
            cPlace.Controls.Add(cGrid);
            cPlace.Controls.Add(cUpdate);
            cPlace.Controls.Add(cMsg);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
        }
    }

jeg prøver at tilføje det til en placeholder på en side:

mainDiv.Controls.Add(cGrid);

Men jeg får fejlen: The best overloaded method match for 'System.Web.UI.ControlCollection.Add(System.Web.UI.Control)' has some invalid arguments

Det ser ud som om, at den ikke opfatter mit grid som en control.
Avatar billede kalp Novice
03. december 2008 - 18:45 #1
class KeenGrid : WebControl

=

class KeenGrid : UserControl

måske
Avatar billede keenkbh Nybegynder
03. december 2008 - 18:52 #2
jeg skal måske indskyde, at KeenGrid ligger i en dll...

Så jeg tror ikke det hjælper at ændre til usercontrol...
Avatar billede kalp Novice
03. december 2008 - 18:56 #3
Nej det er mig som så forkert..
cGrid kan godt ligges ind i en placeholder.
men ud fra navnet mainDiv så lyder det ikke som en placeholder??

så enten er det en fejl at du skriver cGrid fejler..
og ellers er mainDiv ikke en placeholder.
Avatar billede keenkbh Nybegynder
03. december 2008 - 21:22 #4
jeg ved godt, at mainDiv egentlig ikke er det bedste navn/id til en placeholder, men det er nu engang dens navn.

Navngivningen er dovenskab tror jeg, havde nemlig først defineret et alm. div + runat="server". Ændrede det egentlig til placeholder for testens skyld.
Avatar billede kalp Novice
04. december 2008 - 14:42 #5
men den her :
private GridView cGrid = new GridView();

i en placeholder virker fint.. det er det du skriver fejler.
Avatar billede keenkbh Nybegynder
04. december 2008 - 18:05 #6
jeg siger, at min control som helhed ikke vil render...

Hvis den virkede, ville den vise et gridview, en knap og en label...
Avatar billede kalp Novice
04. december 2008 - 20:33 #7
Jeg plejer at gøre sådan her.

På min markup side i toppen skriver jeg:

<%@ Reference Control="KontrollensNavnEvtPlacering.ascx" %>

og i codebehind.

KontrollensNavn control =
                      (KontrollensNavn )this.LoadControl("KontrollensNavnEvtPlacering.ascx");

Placeholder.Control.Add(control);


og det virker for mig fint.
Avatar billede keenkbh Nybegynder
05. december 2008 - 10:25 #8
ja, sådan gør man med en alm. usercontrol...

Men så vidt jeg ved, så er det ikke sådan man gør med en embedded server control.

Jeg har ikke nogle .ascx-filer i min opbygning.
Avatar billede keenkbh Nybegynder
05. december 2008 - 18:16 #9
Jeg har fundet en løsning.

Jeg lod den inherit system.web.ui.control i stedet for webcontrol.

Og så kaldte jeg ensurechildcontrols() i min onInit.

kalp: vil du have lidt point for din ulejlighed?
Avatar billede kalp Novice
05. december 2008 - 18:28 #10
Hvis det virker med UserControl, ja.
Ellers tager du bare point:)

Det blev løst og det er det vigtigste;)
Avatar billede keenkbh Nybegynder
05. december 2008 - 18:37 #11
det virker som en compiled server control.
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