Mam utworzony projekt server control, po dodaniu strony dodalem tez reference zeby powstal Bin z dll i tym drugim plikiem a i jeszcze wrzucilem ta kontrolke do toolboxa tylko ze ta kontrolka nic nie ma oprocz napisu ServiceControl w jaki sposob dodac do niej np button lub cos innego?
Musisz to zrobić ręcznie w kodzie. Button jako pole kontrolki, inicjalizacja w OnInit, a renderowanie w Render.
To jest troche za ogolnie mozesz mi pokaza na tym kodzie gdzie umiescic buttona i np textboxa w tej kontrolce?
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
public class ServerControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
public class LabeledTextBox : TextBox
{
public string PromptText { get; set; }
public int PromptWidth { get; set; }
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
Chyba użycie RenderContents
jest tu nie trafione.
Jeśli masz inne kontrolki w swojej, to najlepiej utworzyć je w OnInit, a później w CreateChildControls je dodajesz do kolekcji Controls.
protected override void CreateChildControls(){this.Controls.Add(this._myButton);}
Jeśli nie chcesz posługiwać się kontrolkami, możesz od razu "produkować" kod html w Render.
protected override void Render(HtmlTextWriter output)
{
output.Write(string.Format("<input type=\"button\" value=\"{0}\" class=\"{1}\" /> <span>A tu jeszcze jakiś teks kontrolki: {2}</span>", this.ButtonText, this.CssClass, this.Text));
}
Jeśli bazowałeś na tym (drugi link):
http://msdn.microsoft.com/en-us/library/zt27tfhy.aspx
http://msdn.microsoft.com/en-us/library/yhzc935f.aspx
to nadpisali RenderContents
, bo dziedziczyli z Label
, która renderuje się w postaci Text, więc nie modyfikowali renderowania tagu span, tylko to co w środku. Tu bardzo wiele zależy od tego czy dziedziczysz z ogólnej System.Web.UI.WebControls.WebControl, czy nawet System.Web.UI.WebControls.Control, czy właśnie jak w przykładzie na MSDN rozszerzasz jakąś istniejącą kontrolkę.
W przypadku roszerzania/modyfikacji istniejącej należy dokładnie zdawać sobie sprawę z tego jak renderuje się dana kontrolka, aby wiedzieć którą jej część chce się zmodyfikować.
[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
public class WebCustomControl1 : WebControl
{
private Button btnOk;
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.btnOk = new Button();
this.btnOk.Text = "Wciśnij mnie";
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
this.btnOk.RenderControl(output);
}
}
To jest plik utworzony tuz po dodaniu server control ja tu nic nie zmienialem i teraz pytam w jaki sposob do tego kodu dodac sobie texbox, button czy co mi tam sie jeszcze podoba, u gory na kodzie jesli moge prosic pokazcie w jaki sposob to dodac?
Ok dzieki somekind a jeszcze w jaki sposob ta kontrolke jak gdyby zaktualizowac?Zeby pokazala mi tego buttonika usunalem dll i wstawile raz jeszcze no ale nadal jest tylko napis ServerControl bez buttona ?
ok znalazlem co i jak dzieki raz jeszcze :D
Jeszcze jedno, jak dodac zdarzenie np dla tego buttona ze po kliknieciu np wyswietli sie messagebox?
Wystawić event w kontrolce, pod który podepnie się strona i wyświetli messagebox.
Lub w kontrolce obsłużyć kliknięcie, ale to fatalne rozwiązanie, bo nie wiesz czy każdy będzie chciał pokazywać messagebox tak samo. Chyba że masz na myśli javascriptowy alert.
Jaki niby MessageBox? To nie jest WinForms!