【问题标题】:How to bind ASP TextBox's Text to its ToolTip?如何将 ASP 文本框的文本绑定到它的工具提示?
【发布时间】:2013-10-16 21:34:00
【问题描述】:

我希望ToolTip 总是和ASP TextBox 的Text 一样。当然可以写

AnyTextBox.Text = "any text";
AnyTextBox.ToolTip = "any text";

但我不想重复数百个赋值语句。 我也可以为 Text 属性编写更改事件处理程序,但我不想为此编写几十个事件处理程序(如果有更优雅的解决方案)

有吗?像这样的:

<asp:TextBox ID="AnyTextBox" runat="server" ToolTip="binding magic goes here, but how?">

提前谢谢

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您可以编写自己的继承自 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">
    

    【讨论】:

    • 这隐藏了原来TextBox的Text属性,所以没办法设置文字。不应使用 _text 支持字段,而应使用 base.Text 作为支持。无论如何,THX :-)
    • @g.pickardou 嘿,应该检查一下!好点,更新的答案
    【解决方案2】:

    据我所知,没有这种自动化。对于它的价值,也许你可以使用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;
    }
    

    您还可以使用处理此事件的UserControl,然后只需将其放在所有应以这种方式运行的页面上。或者您可以让所有页面都从一个基本页面继承。

    【讨论】:

    • 这真是太好了。出于兴趣,您选择将 Control 与 WebControlITextControl 两种类型而不是简单的 TextBox 进行比较的原因是什么?
    • @RGraham:all webcontrols with a Text property 可能需要它,所以就是这样。否则只需检查TextBoxes。但是,如果控件嵌套在像 GridViews(tested) 这样的容器控件中,这也有效。
    • 但是 ITextControl 没有 ToolTip 属性,所以如果控件没有显式声明 ToolTip 属性可能不会失败?
    • @RGraham:这就是为什么我只取出WebControls ;-)
    • 就是这样 :) 谢谢!满足了好奇心,你赢得了我的 +1
    【解决方案3】:

    我认为使用 JavaScript 事件处理程序将是您最简单的解决方案。不过,您不需要编写数百个事件处理程序。只需编写一个,然后为所有文本框使用相同的事件处理程序!

    <asp:TextBox ID="AnyTextBox" runat="server" onchange="setTooltip(this)" />
    

    然后脚本将是

    function setTooltip(textbox) {
        textbox.title = textbox.value;
    }
    

    就是这样!为您希望具有此工具提示行为的所有文本框设置该 onchange 事件。

    【讨论】:

    • 但是即使用户没有改变任何东西,工具提示也应该是文本。
    • 这是非常正确的;因此,在 TextBoxes 可能预先填充了示例文本的情况下,我的回答是不可接受的!良好的观察力。
    【解决方案4】:

    您可以在文本框的 TextChanged 事件中执行此操作:

    <asp:TextBox ID="AnyTextBox" runat="server" TextChanged="AnyTextBoxTextChanged">
    
    protected void AnyTextBoxTextChanged(object sender, EventArgs e)
    {
    this.AnyTextBox.Tooltip = this.AnyTextBox.Text;
    }
    

    【讨论】:

      【解决方案5】:

      这取决于您是否正在寻找工具提示的“实时更新”=即当用户更改网站上的文本时您是否想更改工具提示?然后使用输入和 JS 函数的“onchange”事件,该函数将在每次事件调用时更改其“title”属性。

      或者你想简化你的服务器端工作并且不想为每个项目指定工具提示和文本,然后使用自定义控制方式(我推荐 RGraham 代码)。

      或者匹配这两种方法并使用自定义控件,该控件也将提供 JS“刷新”代码:-)

      【讨论】:

        【解决方案6】:

        尝试使用 jquery

        $(function () {
        
                var maybe = true;
                var text = $('.myTextBox').val();
                if (maybe) {
                    $('.myTextBox').attr('title', text);
                }
        
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-18
          • 2012-07-17
          • 2018-04-19
          • 1970-01-01
          • 2014-10-30
          • 1970-01-01
          • 2016-12-06
          相关资源
          最近更新 更多