Laden...

TextBox mit Initialwert und Datenbindung

Erstellt von hpmberlin vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.323 Views
H
hpmberlin Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren
TextBox mit Initialwert und Datenbindung

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.

S
230 Beiträge seit 2004
vor 16 Jahren

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

H
hpmberlin Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

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?

S
230 Beiträge seit 2004
vor 16 Jahren

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

H
hpmberlin Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

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 🙂

H
hpmberlin Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

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...

N
22 Beiträge seit 2008
vor 16 Jahren

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";
}

5.942 Beiträge seit 2005
vor 16 Jahren

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