Winform の Textbox、NumericUpDown などは高さを変更し、数値やコンテンツを入力する実装を禁止します

創造し続け、成長を加速!「ナゲッツデイリー新プラン・10月アップデートチャレンジ」参加4日目、イベント詳細はこちら

Winform の Textbox および NumericUpDown コントロールは通常 1 行にあり、Height高さをプロパティから直接変更することはできませんが、より適切に表示するために高さを調整する必要があることがよくあります。主に以下の3つの方法を紹介しますが、おすすめの方法はフォントサイズを変更して高さを変更する方法です。

そして、指定された内容の入力を禁止する以下の2つの実装。

導入

テキストボックスはデフォルトで単行モードに設定されており、高さを調整することはできません.TextBox使用中にテキストボックスの高さが適切でない場合は、単行モードでテキストボックスの高さを変更する必要があります.

新しいTextBoxHeightプロジェクト

たとえば、以下に名前と年齢の情報をLabel入力し、プロンプト テキストのサイズを調整します。サイズが一致しないことは明らかです。

高さを変更したい場合はTextbox、次のトリックで実現できます。

AutoSize を false に設定してから、高さを設定します [非推奨]

シングルライン モードを維持し、AutoSizeそれを false に設定してから、高さを設定します。Textbox のプロパティAutoSizeは隠されているため、コードで直接変更する必要があります。

textBox1.AutoSize = false;
textBox1.Height = 28;

numericUpDown1.AutoSize = false;
numericUpDown1.Height = 28;
复制代码

高さが実際に調整されていることがわかりますが、表示されるテキストがコントロール自体の高さと一致せず、多くの空白ができます。

テキストボックスを複数行モードに変更し、Enter キーをシールドします [非推奨]

setプロパティは true で、Textboxさを変更できるようにし、KeyDown キー イベントで Enter キーをシールドして、改行を防ぎ、単一行効果を形成します。MutliLineHeight

textBox1.Multiline = true;
textBox1.Height = 28;
textBox1.KeyDown += TextBox1_KeyDown;

////
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter) //  或 e.KeyValue == 13 或 (int)e.KeyCode == 13
    {
        // 指示按键事件是否应传递到基础控件
        // 如果为true,表示(Key)按键事件不应该发送到该控件
        e.SuppressKeyPress = true;
    }
}
复制代码

この方法にも、テキストと高さの不一致の問題があることがわかります。

フォントサイズを変更することで、Textbox と NumericUpDown の高さを間接的に変更する [推奨]

实际上,单行模式下可直接修改字体的大小,间接的实现高度的变化,NumericUpDown控件也同样适用。

实际测试,可以看到,控件的高度、字体的大小显示等,有着很好的匹配。

NumericUpDown控件的一些常用属性

  • Increment:指示每单击一下按钮时增加或减少的数量
  • DecimalPlaces:指示要显示的小数位数
  • Value:默认显示的数值
  • Maximum:最大值(不能超过)
  • Minimum:最小值(不能超过)
  • RightToLeft:将上下箭头和数字左右调换

Hexadecimal属性设置为true,用于在控件中显示十六进制值。

ThousandsSeparator属性设置为true,可以在十进制数字中显示千位分隔符。

DecimalPlaces属性设置要显示的小数的位数。

Textbox禁止输入数字的实现【利用e.SuppressKeyPress】

TextBoxKeyDown事件方法中,通过判断数字按键,设置e.SuppressKeyPress = true取消数字key事件发送到该控件。

如下,禁止输入数字:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 && e.Modifiers != Keys.Shift) || (e.KeyCode>=Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
    {
        e.SuppressKeyPress = true;
    }
}
复制代码

Winform的键盘按键(key)事件中,可以通过e.KeyCode表示当前的按键。

Keys静态类的Keys.D0 ~ Keys.D9表示键盘顶部的数字键,通常结合Shift可以按下数字键上方的特殊符号。

Keys.NumPad0 ~ Keys.NumPad9表示键盘右侧的小的数字键盘上的数字

因此需用对此进行判断,并阻止其按键事件,实现禁止输入数字。

Textbox禁止输入数字或其他字符【使用TextChanged事件】

禁止输入 数字或者某指定的文字字符 的方法是 在TextChanged事件方法中,通过判断最新的字符是否为数字,如果是则删除该字符,否则保持不变。同样也可以实现禁止输入数字的功能。

インプットメソッドを使用する場合、通常、キーボタンイベントはトリガーされません. 原則として、ボタンイベントはインプットメソッドプログラムによってキャプチャされ、対応するテキスト/文字コンテンツに変換されます. したがって、インプットメソッドを使用して中国語などを入力する場合文字、基本的にはTextChangedイベント経由のみ 入力を禁止する一部機能を実装。

以下は、特定のテキスト文字の入力を禁止するコードの簡単な実装です。errProviderフォームフィールドとして、エラープロンプトに使用されますがcanNotInput、入力を禁止する必要がある他のコンテンツテキストに変更することもできます。

errProvider = new ErrorProvider();

textBox1.TextChanged += TextBox1_TextChanged;

//// ...........

// 实现禁止输入特定文本字符
private void TextBox1_TextChanged(object sender, EventArgs e)
{
    var txtBox= sender as TextBox;

    // 取消错误提示
    errProvider.SetError(txtBox, "");
    // 不为空时
    if (!string.IsNullOrWhiteSpace(txtBox.Text))
    {
        // "0123456789" 也可以改为其他需要禁止输入的内容文字
        var canNotInput = "0123456789";
        if (canNotInput.Contains(txtBox.Text[txtBox.Text.Length - 1]))
        {
            // 删除最后一个字符【两种方式】
            // txtBox.Text = txtBox.Text.Remove(txtBox.Text.Length - 1);
            txtBox.Text = txtBox.Text.Substring(0, txtBox.Text.Length - 1);

            // 重新赋值后光标会出现在最前面
            //txtBox.Focus(); // 通常需要设置文本框获取焦点再使用下面的Select到末尾,但是上面赋值已经有了光标,所以不需要
            // 设置光标位置到文本末尾
            txtBox.Select(txtBox.TextLength, 0);
            // 滚动控件到光标处
            txtBox.ScrollToCaret();

            // 给定一个错误提示
            //errProvider.BlinkStyle= ErrorBlinkStyle.AlwaysBlink;
            errProvider.SetError(txtBox, $"不行允许输入此中的字符:{canNotInput}");
        }
    }
}
复制代码

操作効果は次のとおりです。

次のコードを使用して、カーソルをテキスト ボックスのテキストの末尾に移動 (配置) します。

// 设置文本框获取焦点
txtBox.Focus();
// 设置光标位置到文本末尾
txtBox.Select(txtBox.TextLength, 0);
// 滚动控件到光标处
txtBox.ScrollToCaret();
复制代码

おすすめ

転載: juejin.im/post/7150315546171408398