ich möchte einer TextBox in einer FormView im InsertItemTemplate einen Initialwert verpassen. Solange ich keine Datenbindung vornehme geht das:
<asp:FormView ID="FormViewTest" runat="server" DefaultMode="Insert" DataSourceID="SourceTest">
<InsertItemTemplate>
<fieldset class="daten">
<legend>Bildungsmaßnahme</legend>
<div class="boxLine01">
<div class="contBox02">
<div>
<asp:Label ID="LabelTitle" runat="server" AssociatedControlID="TextBoxTitle">Titel</asp:Label><br />
<asp:TextBox ID="TextBoxTitle" runat="server" CssClass="long" ToolTip="Bitte den Titel hier eingeben" Text="Titel" onblur="if(this.value=='')this.value='Titel';" onfocus="if(this.value=='Titel')this.value='';"></asp:TextBox></div>
<asp:RequiredFieldValidator ID="RequiredTitle" runat="server" InitialValue="Titel" ControlToValidate="TextBoxTitle" Display="None" EnableClientScript="false" ErrorMessage="Das Feld Titel ist leer."></asp:RequiredFieldValidator>
</div>
<br />
</div>
</InsertItemTemplate>
</asp:FormView>
<asp:thumbsup:bjectDataSource ID="SourceTest" runat="server" InsertMethod="AddTest" TypeName="mm.Test" OnInserting="SourceTest_Inserting">
<InsertParameters>
<asp:Parameter Name="UserId" Type="Int32" />
</InsertParameters>
</asp:thumbsup:bjectDataSource>
ersetze ich allerdinsg das Text Attribut mit Text='<%# Bind("Title") %>' dann habe ich keine Möglichkeit gefunden, den Initialwert anzugeben.
Möglich wäre natürlich die Sache im PreReder von Hand vorzunehmen, aber das finde ich uncool 😦
Danke für Rat.
Wenn du auf deiner Textbox Databinding verwendest, dann wird der Initialwert sowieso überschrieben (wenn auch gegebenenfalls mit "") - ein Initialwert bringt dir also gar nichts.
Du kannst aber eine public Methode erstellen, die einen String zurückgibt und der du den "gebundenen Wert" übergeben kannst. Dann kannst du auf NULL oder string.empty abfragen und durch einen "initialwert" erstetzen.
Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso
dass das so nicht gehen kann, ist mir schon bewusst; ich suche nach einer Alternative... 🙂
du meinst mit einer Helper-Methode?
wäre ja chic, nur ist mir mit der neune Datenbindungsmethode nicht bekannt, wie ich eine Helper-Methode verwende. gehen tut wohl:
<%# GetInitialValue(DataBinder.Eval(Container.DataItem, "Title"), "Initial Wert")%>
aber leider funzt so nur die einfache Bindung und nicht die doppelte, was dazu führt, dass das Mapping auf meine Datenquelle nicht mehr passt...
Soweit ich weiss, kann man mit der neunen Bind() Methode keine Helper-Funktionen verwenden - oder irre ich da?
Was mir noch dazu einfällt ist, dass du das auf der Datenschicht abfangen kannst, wenn du eine DAL verwendest. Ansonsten weiss ich auch nicht weiter.
Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso
für alle die es möglichwerweise interessiert...
nun habe ich das Problem gelöst, indem ich die TextBox erweitert habe:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Test.Controls
{
[ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")]
public class TextBox : System.Web.UI.WebControls.TextBox
{
protected string _watermarkText = null;
[Description("Set watermark text"), Category("Custom"), DefaultValue(null)]
public string WatermarkText
{
get { return _watermarkText; }
set { _watermarkText = value; }
}
protected bool _enableCleanOnFocus = true;
[Description("Enable or disable cleaning watermark text when control get focus"), Category("Custom"), DefaultValue(true)]
public bool EnableCleanOnFocus
{
get { return _enableCleanOnFocus; }
set { _enableCleanOnFocus = value; }
}
protected bool _enableResetOnBlur = true;
[Description("Enable or disable reset watermark text when control lost focus"), Category("Custom"), DefaultValue(true)]
public bool EnableResetOnBlur
{
get { return _enableResetOnBlur; }
set { _enableResetOnBlur = value; }
}
protected override void CreateChildControls()
{
base.CreateChildControls();
if (!string.IsNullOrEmpty(_watermarkText))
{
if (string.IsNullOrEmpty(this.Text))
{
this.Text = _watermarkText;
}
if (_enableCleanOnFocus)
{
this.Attributes.Add("onfocus", string.Format("if(this.value=='{0}')this.value='';", _watermarkText));
}
if (_enableResetOnBlur)
{
this.Attributes.Add("onblur", string.Format("if(this.value=='')this.value='{0}';", _watermarkText));
}
}
}
}
}
und dann
<test:TextBox ID="TextBoxTitle" runat="server" CssClass="long" ToolTip="Bitte den Titel hier eingeben" Text='<%# Bind("Title") %>' WatermarkText="Titel"></test:TextBox>
aber eine einfachere Lösung würde ich bevorzugen 🙂
nochmals Dank nach Luzern!
das mit der Datenschicht war auch mein erster Gedanke, aber hat auch nicht gefruchtet, da im InsertItemTemplate nicht gebunden wird (erst nach dem PostBack mit der Insert-Methode). Trotzdem danke; das Problem zu beschreiben bringt einem meist schon auf eine Lösung...
Hmm, ich hatte da einen ähnlichen Fall und es ganz einfach gelöst indem ich beim Page_Load die Werte in den Textboxen gesetzt hatte.
<InsertTemplate>
<asp:TextBox ID="Name" Text='<%# Bind("Name") %>'></asp:TextBox>
</InsertTemplate>
Im Page_Load...
if (FormView.CurrentMode = FormViewMode.Insert)
{
((TextBox)FormView.FindControl("Name")).Text = "Neuer User";
}
Hallo zusammen
Es gibt immer viele verschiedene Wege, sieht man hier wieder 🙂
@hpmberlin
Ich würde deine erweiterte Klasse nicht "TextBox" nennen.
Denn spätestens wenn du diese im Codebehind dynamisch verwendest, läufst du in einen Namenskonflikt.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011