【问题标题】:Reseting label back to design-time .Text value将标签重置回设计时 .Text 值
【发布时间】:2021-07-08 14:51:54
【问题描述】:

我有一堆标签,我在设计器中设置了它们的值,后来在runtime 更新它们,但是在使用它们之后,我想将它们设置回它们的默认值。我这样做的目的是减少大代码的数量,使其更易于阅读。

随机例子,在lbl_fruitText = no fruits available currently的设计器中设置然后

*code*
lbl_fruits.Text = "banana";
*code*
lbl_fruits.ResetText(); // I want something like this
lbl_fruits.Text = "no fruits available currently"; // Instead of this

.ResetText(); 对此不起作用,因为标签文本会被清理而不是返回“当前没有可用的水果”

我目前的解决方案是制作自定义标签控件。

public class ExLabel : Label
    {
        private string defaultValue = "";
        public string DefaultValue
        {
            get { return defaultValue; }
            set { defaultValue = value; this.Invalidate(); }
        }
        protected override void OnControlAdded(ControlEventArgs e)
        {
            defaultValue = this.Text;
            MessageBox.Show("This code is being run");
            base.OnControlAdded(e);
        }

        public void ResetValue()
        {
            this.Text = defaultValue;
        }
    }

如果我使用我制作的自定义属性,此代码目前可以解决我的问题,但对我来说,理想的解决方案是将 design-time text 值作为默认值,而不是我制作的额外属性。 OnControlAdded() 不会被执行,OnPaint()lbl_fruits.Text = "banana"; 发生时再次运行。

所以问题是:我可以覆盖哪个事件,以便代码在标签加载后立即执行,但不会运行两次。另外,有没有更简单的方法来解决这个问题?

【问题讨论】:

  • 您调用的 design-time 值将保存在资源中并在InitializeComponents() 调用期间加载。你也可以做到的。保持当前设计,您必须在表单设计器中设置 DefaultValue 并简单地从设置器中设置 Text 值。
  • “目前没有可用的水果” 表示您正在进行某种验证或显示状态。不确定默认值是否真的那么有用,因为您可能需要多个错误:不可用、输入的负数、日期来自过去等。也许您只需要多个标签并根据错误控制它们的可见性?还是制作一个专门的错误类来保存所有错误和相应的文本?
  • 我相信您需要在执行一些逻辑后将值更改回默认值。理想的方法是编写一个辅助方法来确保所有控件都在给定的操作上被重置。或者你可以有一个 Dictionary 映射,可以调用它来清除和重置。
  • 它们的值是要显示的客户端数据,有些字段可以为空,所以要么是数据库带来的数据,要么没有数据,它们要显示“x字段中没有数据”,然后一旦加载它就会成为需要显示的值,当用户从下一个客户端加载数据时,一切都会被重置,只有有数据的字段才会被加载。此外,当用户离开页面时,每个页面都将被重置。

标签: c# winforms label default-value


【解决方案1】:
public class ExLabel : Label
{
    private string defaultValue = "";
    public string DefaultValue
    {
        get { return defaultValue; }
        set { defaultValue = value; this.Invalidate(); }
    }
    protected override void OnControlAdded(ControlEventArgs e)
    {
        defaultValue = this.Text;
        MessageBox.Show("This code is being run");
        base.OnControlAdded(e);
    }

    public void ResetValue()
    {
        this.Text = defaultValue;
    }
}

【讨论】:

    【解决方案2】:

    最后我使用的解决方案是这样的:

    public class ExLabel : Label
    {
        private string defaultValue = "";
        public string DefaultValue
        {
            get { return defaultValue; }
            set { defaultValue = value; this.Invalidate(); }
        }
    
        protected override void OnPaint(PaintEventArgs e)
        {
            if(defaultValue == "" && !this.Text.Contains("exLabel"))
            {
                defaultValue = this.Text;
            }
            base.OnPaint(e);
        }
    
        public void ResetValue()
        {
            this.Text = defaultValue;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多