C# 如何绑定ASP文本框&x27;将文本添加到其工具提示中?
我希望工具提示始终与ASP文本框的文本相同。我当然会写C# 如何绑定ASP文本框&x27;将文本添加到其工具提示中?,c#,asp.net,C#,Asp.net,我希望工具提示始终与ASP文本框的文本相同。我当然会写 AnyTextBox.Text = "any text"; AnyTextBox.ToolTip = "any text"; 但我不想重复数百条赋值语句。 我还可以为Text属性编写change事件处理程序,但我不想为此编写几十个事件处理程序(如果有更优雅的解决方案的话) 有吗?大概是这样的: <asp:TextBox ID="AnyTextBox" runat="server" ToolTip="binding magic goe
AnyTextBox.Text = "any text";
AnyTextBox.ToolTip = "any text";
但我不想重复数百条赋值语句。
我还可以为Text属性编写change事件处理程序,但我不想为此编写几十个事件处理程序(如果有更优雅的解决方案的话)
有吗?大概是这样的:
<asp:TextBox ID="AnyTextBox" runat="server" ToolTip="binding magic goes here, but how?">
Thx提前您可以编写自己的自定义控件,该控件继承自TextBox?我使用了Text属性来设置工具提示,但是如果您愿意,也可以用其他方法来设置 控制:
public class TooltipTextBox : TextBox {
public new string Text {
get { return base.Text; }
set
{
base.Text = value;
this.ToolTip = value;
}
}
}
<my:TooltipTextBox ID="AnyTextBox" runat="server" Text="binding magic goes here">
标记:
public class TooltipTextBox : TextBox {
public new string Text {
get { return base.Text; }
set
{
base.Text = value;
this.ToolTip = value;
}
}
}
<my:TooltipTextBox ID="AnyTextBox" runat="server" Text="binding magic goes here">
您可以在文本框的TextChanged事件中执行此操作:
<asp:TextBox ID="AnyTextBox" runat="server" TextChanged="AnyTextBoxTextChanged">
protected void AnyTextBoxTextChanged(object sender, EventArgs e)
{
this.AnyTextBox.Tooltip = this.AnyTextBox.Text;
}
受保护的void AnyTextBoxTextChanged(对象发送方,事件参数e)
{
this.AnyTextBox.Tooltip=this.AnyTextBox.Text;
}
据我所知,没有这种自动性。不管它值多少钱,也许您可以使用PreRender
:
protected void Page_PreRender(Object sender, EventArgs e)
{
var allTextControlsWithTooltips = new List<WebControl>();
var stack = new Stack<Control>(this.Controls.Cast<Control>());
while (stack.Count > 0)
{
Control currentControl = stack.Pop();
if (currentControl is WebControl && currentControl is ITextControl)
allTextControlsWithTooltips.Add((WebControl)currentControl);
foreach (Control control in currentControl.Controls)
stack.Push(control);
}
foreach (var txt in allTextControlsWithTooltips)
txt.ToolTip = ((ITextControl)txt).Text;
}
受保护的无效页面\u预呈现(对象发送方,事件参数e)
{
var allTextControlsWithTooltips=新列表();
var stack=新堆栈(this.Controls.Cast());
而(stack.Count>0)
{
Control currentControl=stack.Pop();
if(currentControl是WebControl&¤tControl是ITextControl)
添加((网络控制)currentControl);
foreach(currentControl.Controls中的控制)
堆栈推送(控制);
}
foreach(allTextControlsWithTooltips中的var txt)
txt.ToolTip=((ITextControl)txt).Text;
}
您还可以使用处理此事件的
UserControl
,然后只需将其放在所有应以这种方式运行的页面上。或者您可以让所有页面从一个基本页面继承。我认为使用JavaScript事件处理程序将是最简单的解决方案。不过,您不需要编写数百个事件处理程序。只需编写一个,然后对所有文本框使用相同的事件处理程序
<asp:TextBox ID="AnyTextBox" runat="server" onchange="setTooltip(this)" />
就这样!为您希望具有此工具提示行为的所有文本框设置onchange事件。这取决于您是否正在查找工具提示的“实时更新”=即,当用户更改网站上的文本时,是否要更改工具提示?然后使用输入的“onchange”事件和JS函数,该函数将在每次事件调用中更改其“title”属性 或者您希望简化服务器端的工作,并且不希望为每个项目指定工具提示和文本,然后使用自定义控件方式(我建议使用RGraham代码) 或者匹配这两个方法并使用自定义控件,该控件还将提供JS“刷新”代码:-)尝试使用jquery
$(function () {
var maybe = true;
var text = $('.myTextBox').val();
if (maybe) {
$('.myTextBox').attr('title', text);
}
});
这真是太好了。出于兴趣,您选择将控件与两种类型的
WebControl
和ITextControl
进行比较,而不是简单的文本框,原因是什么?@RGraham:这可能是您想要的,所以就是这样。否则只需检查文本框
。但是,如果控件嵌套在容器控件中,如gridview
(已测试),这也会起作用。但是ITextControl没有工具提示属性,因此如果控件没有显式声明工具提示属性,这可能会失败吗?@RGraham:这就是为什么我只取出网络控件的原因这就是:)谢谢!好奇心满足了,你赢得了我的+1,但是即使用户没有改变任何东西,工具提示也应该是文本;因此,如果文本框可能预先填充了示例文本,那么我的答案是不可接受的!很好的观察。这隐藏了原始文本框的文本属性,因此无法设置文本。不应使用_textbacking字段,而应使用base.text作为backing。无论如何THX:-)@g.pickardou-Heh,应该检查一下这个!很好的观点,更新的答案