【问题标题】:Editable Button Text可编辑的按钮文本
【发布时间】:2019-05-25 04:30:07
【问题描述】:

我有一个在运行时创建的按钮

Button myBtn = new Button();
Initialize(myBtn);
myBtn.Click += myBtn_Click();
myBtn.Text="Add or Edit Text";//default text string

当用户clickmyBtn时,它将突出显示现有文本,并且可以编辑,用户可以输入任何新的text

如何在click event 期间使button control 可编辑?

用户点击并输入任何字符串后,结果将是myBtn.Text = "Any Text"

例如:myBtn.Text="Add or Edit Text"; //点击前

myBtn.Text="any text or string that user type it"; //点击后

【问题讨论】:

  • 你真正想要做什么?似乎很混乱
  • 我们称之为TextBox
  • @Justcode 如果用户单击一个按钮,现有的 button.text 将突出显示,用户现在可以输入他/她想要的任何内容并更新为新字符串
  • @TheGeneral 是的,它就像一个文本框,但在按钮控件中。
  • 这似乎是对标准Windows控件的公然滥用,只是说,谁会知道单击按钮来更改文本?但是,您可能希望在按钮上覆盖一个文本框,或使用弹出对话框输入文本

标签: c# .net winforms button textbox


【解决方案1】:

您可以将TextBox 添加到Button 控件并创建具有以下方法和属性的EditableButton 控件:

  • EditMode:获取或设置编辑将如何开始。可以是OnPressF2OnClickProgrammatically。根据此属性的值,编辑将通过按 F2Click 或您的代码调用 BeginEdit 开始。

  • BeginEdit():通过显示TextBox 开始编辑。

  • EndEdit():结束编辑并隐藏文本框并将TextBox的文本提交为Button的文本。
  • CancelEdit():取消编辑,隐藏文本框。
  • IsEditing:判断控件是否处于编辑模式,TextBox是否可见。

  • Enter 结束编辑并提交文本。

  • Escape 取消编辑并放弃更改。

可编辑按钮

这是一个具有上述属性和方法的按钮控件示例。您可以通过添加一些事件(如 BeginingEditingEndingEdit 或公开 TextBox 的一些属性或事件来增强它。

using System;
using System.Windows.Forms;

public class EditablButton : Button
{
    private TextBox txt;
    public enum EditModes { OnPressF2, OnClick, Programmatically }
    public EditModes EditMode { get; set; } = EditModes.OnPressF2;
    public bool IsEditing => txt.Visible;
    public EditablButton()
    {
        txt = new TextBox();
        txt.TextAlign = HorizontalAlignment.Center;
        txt.Visible = false;
        txt.Multiline = true;
        txt.Dock = DockStyle.Fill;
        this.Controls.Add(txt);
        txt.KeyDown += Txt_PreviewKeyDown;
    }
    private void Txt_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            EndEdit();
            e.Handled = true;
            e.SuppressKeyPress = true;
        }
        else if (e.KeyData == Keys.Escape)
        {
            CancelEdit();
            e.Handled = true;
            e.SuppressKeyPress = true;
        }
    }
    public void BeginEdit()
    {
        txt.Text = this.Text;
        txt.SelectAll();
        txt.Visible = true;
        txt.Focus();
    }
    public void EndEdit()
    {
        this.Text = txt.Text;
        txt.Visible = false;
        this.Focus();
    }
    public void CancelEdit()
    {
        txt.Visible = false;
        this.Focus();
    }
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (!IsEditing && EditMode == EditModes.OnPressF2 && keyData == Keys.F2)
        {
            BeginEdit();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
    protected override void OnClick(EventArgs e)
    {
        if (EditMode == EditModes.OnClick)
            BeginEdit();
        else
            base.OnClick(e);
    }
}

【讨论】:

  • 这几乎是我要找的,但与其按 F2,不如单击鼠标左键
  • 我为此创建了一个属性。 EditMode,可以设置为OnPressF2OnClickProgrammatically。将控件实例拖放到表单上后,只需将其 EditMode 设置为 OnClick 即可通过单击开始编辑。您也可以在代码中更改默认值。
  • 我在我的代码中添加了一些东西。我想捕捉按钮的点击事件。 string newString = ""; myBtn.Click += (sender, args) => { newString = myBtn.Text; }; 好像不行,我认为是因为点击事件已经在按钮中实现了。
  • if (EditMode == EditModes.OnClick) BeginEdit(); 它禁用Click 事件,因为它没有调用base.OnClick(e);。如果出于任何原因你想要Click 事件引发(虽然我不同意这个想法),你可以取消注释else 语句并让base.OnClick(e); 调用,不管编辑模式如何。
  • 如果您有兴趣收到有关更改文本的通知,订阅按钮的TextChange 事件就足够了。
【解决方案2】:

您可以在用户可以写一些文本的地方放置一个文本框,然后单击按钮可以设置文本:

myBtn.Text=txt_value.Text;

或者您可以尝试以下方法来突出显示文本:

默认设置文本框Visible=False;

开启myBtn_Click

txt_value.Visible=True;
myBtn.FontBold=True;
myBtn.Text=txt_value.Text; //to change the text each time the button is clicked

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2021-10-09
    • 2015-07-21
    • 2019-01-08
    • 2016-12-23
    • 2011-03-17
    • 1970-01-01
    • 2017-05-20
    • 2016-04-07
    相关资源
    最近更新 更多