C# - ASP.NET въпрос .....
11 отговора
294 прегледа
C# - ASP.NET въпрос .....
Здравейте !
Първо -> ЗА МНОГО ГОДИНИ !!!!
Второ -> Имам следния въпрос :
Създавам Run-time чрез C# , ASP.NET сървърен контол от тип Таблица.Създавам клетка по клетка , ред по ред и ги добявям към Таблицата , като в същото време и им задавам свойствата Run-time..Всичко беше нормално , до момента в който реших да добавя TextBox i Button контроли в TableCell отново RunTime ...Тогава, при стартиране на проекта ми изписва съобщение :
Control '_ctl1' of type 'TextBox' must be placed inside a form tag with runat=server.
Когато погледнах HTML кода видях че всичко което създавам rub-time ми го добавя след таговете за Форма и ХТМЛ ....След което чрез LiteralControl добавих тагове за форма в самата клетка , а създаването на textbox-ovete наместих между двата добавени тагове за форма ...Но въпреки това - пак ми дава същото съобщение ....
Някой ще ми обясни ли с думи прости - как трябва да създам run-time контроли (textbox,button.....) и да ги добавя към таблица /сървърен конторол/ която се създава и инициализира отново run-time ....
Благодаря ви предварително !!!
Всичко най-добро !
Първо -> ЗА МНОГО ГОДИНИ !!!!
Второ -> Имам следния въпрос :
Създавам Run-time чрез C# , ASP.NET сървърен контол от тип Таблица.Създавам клетка по клетка , ред по ред и ги добявям към Таблицата , като в същото време и им задавам свойствата Run-time..Всичко беше нормално , до момента в който реших да добавя TextBox i Button контроли в TableCell отново RunTime ...Тогава, при стартиране на проекта ми изписва съобщение :
Control '_ctl1' of type 'TextBox' must be placed inside a form tag with runat=server.
Когато погледнах HTML кода видях че всичко което създавам rub-time ми го добавя след таговете за Форма и ХТМЛ ....След което чрез LiteralControl добавих тагове за форма в самата клетка , а създаването на textbox-ovete наместих между двата добавени тагове за форма ...Но въпреки това - пак ми дава същото съобщение ....
Някой ще ми обясни ли с думи прости - как трябва да създам run-time контроли (textbox,button.....) и да ги добавя към таблица /сървърен конторол/ която се създава и инициализира отново run-time ....
Благодаря ви предварително !!!
Всичко най-добро !
Re: C# - ASP.NET въпрос .....
Ами може би трябва да пуснеш малко код, че да видим. Аз примерно пробвах следното - проработи без никакви проблеми.
StringWriter sw = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(sw);
Table t = new Table();
TableRow r = new TableRow();
TableCell c = new TableCell();
Button b = new Button();
b.Text = "Test";
t.Controls.Add(r);
r.Controls.Add(c);
c.Controls.Add(b);
t.RenderControl(tw);
string htmlOutput = sw.ToString();
Ако правиш сървърен контрол, който нества други контроли, трябва да имплментираш INamingContainer interface.
StringWriter sw = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(sw);
Table t = new Table();
TableRow r = new TableRow();
TableCell c = new TableCell();
Button b = new Button();
b.Text = "Test";
t.Controls.Add(r);
r.Controls.Add(c);
c.Controls.Add(b);
t.RenderControl(tw);
string htmlOutput = sw.ToString();
Ако правиш сървърен контрол, който нества други контроли, трябва да имплментираш INamingContainer interface.
Re: C# - ASP.NET въпрос .....
А сега като ти чета въпроса втори път... въобще не трябва да се занимаваш с форм тага вътре в даден контрол. Примерно направи си следния ХТМЛ:
<html>
<form runat="server">
<asp:placeholder runat="server" id="placeHolder">
</form>
</html>
После, в code-behind-а можеш да пишеш примерно следния код:
Button b = new Button();
b.Text = "Click me!";
placeHolder.Controls.Add(b);
В смисъл плейсхолдър контрола е измислен специално за това, което на тебе ти трябва ако не се лъжа.
<html>
<form runat="server">
<asp:placeholder runat="server" id="placeHolder">
</form>
</html>
После, в code-behind-а можеш да пишеш примерно следния код:
Button b = new Button();
b.Text = "Click me!";
placeHolder.Controls.Add(b);
В смисъл плейсхолдър контрола е измислен специално за това, което на тебе ти трябва ако не се лъжа.
Re: C# - ASP.NET въпрос .....
Здравей !
Току що си открих проблема ...
Както писах и преди , когато създавам нещо run-time, то ми се добавя след таговете за форма и хтмл в уеб формата ...Въпреки,че използвах код от рода на :
this.controls.add(tbl)
Но в случая се получаваше следното :
<html>
<body>
<form> </form>
</body>
</html>
<asp:table></table>
тоест контролите ми са извън стандартните тагове...
Решението дойде когато добавих :
this.Controls[1].Controls.Add(tbl)
където Controls[1] e тагът за форма ..
И вслучая стана :
<html>
<body>
<form><asp:table></table>
</form>
</body>
</html>
като вече мога да си слагам желаните контроли ....
П.С. -> Май избързах малко с въпроса ,преди да съм опитал и проверил всички начини ....
Благодаря още веднъж .....
Току що си открих проблема ...
Както писах и преди , когато създавам нещо run-time, то ми се добавя след таговете за форма и хтмл в уеб формата ...Въпреки,че използвах код от рода на :
this.controls.add(tbl)
Но в случая се получаваше следното :
<html>
<body>
<form> </form>
</body>
</html>
<asp:table></table>
тоест контролите ми са извън стандартните тагове...
Решението дойде когато добавих :
this.Controls[1].Controls.Add(tbl)
където Controls[1] e тагът за форма ..
И вслучая стана :
<html>
<body>
<form><asp:table></table>
</form>
</body>
</html>
като вече мога да си слагам желаните контроли ....
П.С. -> Май избързах малко с въпроса ,преди да съм опитал и проверил всички начини ....
Благодаря още веднъж .....
Re: C# - ASP.NET въпрос .....
А иначе пробвах и с ПлейсХолдър и с Панел ,но не помогнаха преди да променя кода за добавяне на контролите ....
Re: C# - ASP.NET въпрос .....
Ами this.controls.add(tbl) в контекста на Page, просто добавя контроли след последния контрол на страницата, така че е логично да ги добавя последни и извън форм тага.
this.Controls[1].Controls.Add(tbl) е нагласено малко. В смисъл никога нямаш гаранция кой контрол с кой индекс е - ако се промени нещо по страницата Controls[1] ще е нещо друго, а не форма, и кода ти няма да работи.
Значи това, което ти написах за плейсхолдъра е начина по-който се прави това, гледал съм го по доста примери, използвал съм го и няма начин да не работи - слагаш плейсхолдър вътре във формата и добавяш контроли към него, а не директно към цялата страница.
Инстанс към плейсхолдъра имаш директно по ID ако си го декларирал в коуд-бихайнда като protected или чрез Page.FindControl(placeHolderID);
this.Controls[1].Controls.Add(tbl) е нагласено малко. В смисъл никога нямаш гаранция кой контрол с кой индекс е - ако се промени нещо по страницата Controls[1] ще е нещо друго, а не форма, и кода ти няма да работи.
Значи това, което ти написах за плейсхолдъра е начина по-който се прави това, гледал съм го по доста примери, използвал съм го и няма начин да не работи - слагаш плейсхолдър вътре във формата и добавяш контроли към него, а не директно към цялата страница.
Инстанс към плейсхолдъра имаш директно по ID ако си го декларирал в коуд-бихайнда като protected или чрез Page.FindControl(placeHolderID);
Re: C# - ASP.NET въпрос .....
Относно PlaceHolder-a , при следния код :
Table tbl;
TableRow tr;
TableCell tc;
PlaceHolder ph;
TextBox txt;
....
....
tbl = new Table();
tr = new TableRow();
tc = new TableCell();
txt = new TextBox();
ph = new PlaceHolder();
ph.Controls.Add(txt);
tc.Controls.Add(ph);
tr.Controls.Add(tc);
tbl.Controls.Add(tr);
//Ako go napisha taka , gyrmi nezavisimo dali e v PlaceHolder ili ne :
this.Controls.Add(tbl);
//Ako go napisha taka - minava nezavisimo dali e v PlaceHolder ili ne :
this.Controls[1].Controls.Add(tbl);
//v sluchaia Controls[1] e HtmlForm (standartno syzdadena ot WEB Designera/
Съгласен съм ,че е доста непрактиочно използването на индекс, но ж момента търся начин по който да се обърна към HTML формата в
Controls.IndexOf(control value)
Знаеш ли как /и дали въобще може / да се обърна към HTML формата като промелива в indexOf() ...?
Благодаря ти за вниманието !
Table tbl;
TableRow tr;
TableCell tc;
PlaceHolder ph;
TextBox txt;
....
....
tbl = new Table();
tr = new TableRow();
tc = new TableCell();
txt = new TextBox();
ph = new PlaceHolder();
ph.Controls.Add(txt);
tc.Controls.Add(ph);
tr.Controls.Add(tc);
tbl.Controls.Add(tr);
//Ako go napisha taka , gyrmi nezavisimo dali e v PlaceHolder ili ne :
this.Controls.Add(tbl);
//Ako go napisha taka - minava nezavisimo dali e v PlaceHolder ili ne :
this.Controls[1].Controls.Add(tbl);
//v sluchaia Controls[1] e HtmlForm (standartno syzdadena ot WEB Designera/
Съгласен съм ,че е доста непрактиочно използването на индекс, но ж момента търся начин по който да се обърна към HTML формата в
Controls.IndexOf(control value)
Знаеш ли как /и дали въобще може / да се обърна към HTML формата като промелива в indexOf() ...?
Благодаря ти за вниманието !
Re: C# - ASP.NET въпрос .....
Нещо очевидно не съм обяснил правилно, става дума да добавиш цялата таблица към плейсхолдъра, не само вътрешните за дадена клетка контроли.
В смисъл aspx/ascx темплейта ти да е нещо от сорта на:
<form runat="server">
<asp:placeholder runat="server" id="place" />
</form>
А кода:
Table tbl;
TableRow tr;
TableCell tc;
TextBox txt;
....
....
tbl = new Table();
tr = new TableRow();
tc = new TableCell();
txt = new TextBox();
tc.Controls.Add(txt);
tr.Controls.Add(tc);
tbl.Controls.Add(tr);
Page.FindControl("place").Controls.Add(tbl);
В смисъл aspx/ascx темплейта ти да е нещо от сорта на:
<form runat="server">
<asp:placeholder runat="server" id="place" />
</form>
А кода:
Table tbl;
TableRow tr;
TableCell tc;
TextBox txt;
....
....
tbl = new Table();
tr = new TableRow();
tc = new TableCell();
txt = new TextBox();
tc.Controls.Add(txt);
tr.Controls.Add(tc);
tbl.Controls.Add(tr);
Page.FindControl("place").Controls.Add(tbl);
Re: C# - ASP.NET въпрос .....
Zdravei.
Silno ti preporychvam da zabravish za reshenieto:
this.Controls[1].Controls.Add(tbl)
dori i da bachka.
TextBox v kraina smetka triabva da ima parent/ancestor server form control (HtmlForm mislia che beshe)
t.e.
<body>
<form id="Form1" runat="server">
<asp:table runat="server"></asp:table>
</form>
</body>
(v codebehind-a si go imash kato: protected HtmlForm Form1
tova v sluchai che naistina ti potribva)
togava prosto si dobaviash Table-a v Controls collection-a na tvoia si control bez da se pritesniavash.
koda koito si paste-nal ne e mnogo tochen.
nito imash <form runat="server">, nito tvoia custom control e vytre, nito mojesh da imash custom control koito da ima server tag prefix "asp".
a dokolkoto znam Web Server Control Table niama. Ima HTML Server Control Table - HtmlTable
t.e.
<table runat="server">
t.e. vsichko mi e goliama mygla. symniavam se che i Guru i Teliaka sa te razbrali pravilno.
ne znam kakvo imash tochno vpredvid "runtime" control (ima Web Server contro, HTML Server Contro, Custom Control, Web User Control..., no runtime control niama).
ako iskash si paste-ni niakakyv tochen code snippet, za da poluchish (v sluchai che iskash) razumen otgovor.
v protiven sluchai shte poluchavash otgovori ot roda na "polzvai placeholder" ili nameri si server form control-a sys FindControl, koito moje bi naistina imat smisyl, no nikoga niama da razberem dali shte sa ti svyrshili rabota i shte ostane edno takova kofti chuvtstvo i pri men, i pri Guru, i pri Teliaka.
a nie prosto iskame da populiarizirame tozi prekrasen framework.
za da byde jivota po-hubav, po-lesen... po-krasiv. i vsichki da jiveem v edin po-dobyr sviat. dokato Microsoft ne pusnat .NET 2.0 i se okaje che triabva da prenapishem polovinata ot neshtata koito sme pisali.

Silno ti preporychvam da zabravish za reshenieto:
this.Controls[1].Controls.Add(tbl)
dori i da bachka.
TextBox v kraina smetka triabva da ima parent/ancestor server form control (HtmlForm mislia che beshe)
t.e.
<body>
<form id="Form1" runat="server">
<asp:table runat="server"></asp:table>
</form>
</body>
(v codebehind-a si go imash kato: protected HtmlForm Form1
tova v sluchai che naistina ti potribva)
togava prosto si dobaviash Table-a v Controls collection-a na tvoia si control bez da se pritesniavash.
koda koito si paste-nal ne e mnogo tochen.
nito imash <form runat="server">, nito tvoia custom control e vytre, nito mojesh da imash custom control koito da ima server tag prefix "asp".
a dokolkoto znam Web Server Control Table niama. Ima HTML Server Control Table - HtmlTable
t.e.
<table runat="server">
t.e. vsichko mi e goliama mygla. symniavam se che i Guru i Teliaka sa te razbrali pravilno.
ne znam kakvo imash tochno vpredvid "runtime" control (ima Web Server contro, HTML Server Contro, Custom Control, Web User Control..., no runtime control niama).
ako iskash si paste-ni niakakyv tochen code snippet, za da poluchish (v sluchai che iskash) razumen otgovor.
v protiven sluchai shte poluchavash otgovori ot roda na "polzvai placeholder" ili nameri si server form control-a sys FindControl, koito moje bi naistina imat smisyl, no nikoga niama da razberem dali shte sa ti svyrshili rabota i shte ostane edno takova kofti chuvtstvo i pri men, i pri Guru, i pri Teliaka.
a nie prosto iskame da populiarizirame tozi prekrasen framework.
za da byde jivota po-hubav, po-lesen... po-krasiv. i vsichki da jiveem v edin po-dobyr sviat. dokato Microsoft ne pusnat .NET 2.0 i se okaje che triabva da prenapishem polovinata ot neshtata koito sme pisali.
Re: C# - ASP.NET въпрос .....
Zdravei i ot men !
Otnosno this.Controls[1]....., ptoblema mi se reshi ...Stana s
this.FondControl("Form1").Add(tbl)
KOgato dobavia tablicata po tozi nachin tia si vliza tochno vyv formata syszdadena pyrvonachalno v WebForm.aspx....Toest tuk si ima veche vryzka parent/ancestor i vischko si e taka kakto triabva ...
A inache ima System.Web.UI.WebControls.Table -> az polzvam tochno nego ...Syzdavam go i go intiialziram v CodeBehind ....I kogato metodite se izpykniat na IIS , toi si gi "izpluva " sys vsichkite mu atributi koito sym mu zadal /kakto i tezi po podrazbirane - vkl. <runat ="server" > i <asp:/ .V interes na istinata pozvam sysvsem malko HTML controls ....
Otnosno "runtime " controla, sega ne mi se gleda, no ako sym go napisal taka e greshka ot nedoglejdane ....Imam v predvid che e Web Server Control koito se syzdava i init. run time ...
A inache i az sym dovolen ot ASP.NET i C# ... Vsichko nai-dobro !
Otnosno this.Controls[1]....., ptoblema mi se reshi ...Stana s
this.FondControl("Form1").Add(tbl)
KOgato dobavia tablicata po tozi nachin tia si vliza tochno vyv formata syszdadena pyrvonachalno v WebForm.aspx....Toest tuk si ima veche vryzka parent/ancestor i vischko si e taka kakto triabva ...
A inache ima System.Web.UI.WebControls.Table -> az polzvam tochno nego ...Syzdavam go i go intiialziram v CodeBehind ....I kogato metodite se izpykniat na IIS , toi si gi "izpluva " sys vsichkite mu atributi koito sym mu zadal /kakto i tezi po podrazbirane - vkl. <runat ="server" > i <asp:/ .V interes na istinata pozvam sysvsem malko HTML controls ....
Otnosno "runtime " controla, sega ne mi se gleda, no ako sym go napisal taka e greshka ot nedoglejdane ....Imam v predvid che e Web Server Control koito se syzdava i init. run time ...
A inache i az sym dovolen ot ASP.NET i C# ... Vsichko nai-dobro !
Re: C# - ASP.NET въпрос .....
Та значи по този начин таблицата ще се добавя винаги последна към форм тага, което за твоя случай може да те устройва, но в общия случай в тази форма имаш доста други контроли и таблицата може да е някъде по средата - следователно така няма да проработят нещата.
В общият случай подхода с плейсхолдър е най-добър и нещо като best-practice - в смисъл по много код примери в МСДН-а и по разни сайтове може да видиш именно такова решение на този проблем.
В общият случай подхода с плейсхолдър е най-добър и нещо като best-practice - в смисъл по много код примери в МСДН-а и по разни сайтове може да видиш именно такова решение на този проблем.