将用户输入锁定到控件中

时间:2011-04-05 14:46:42

标签: c# winforms user-input

好吧,这是我昨天问过的一个问题,但我觉得它应该是自己的帖子。我做了这个控制:

public partial class LinkLabelTextBoxPlayerName : UserControl
{
    public LinkLabelTextBoxPlayerName()
    {
        InitializeComponent();
        this.textBox.Hide();
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        this.linkLabel.Hide();

        this.textBox.Show();
        this.textBox.Focus();
        this.textBox.KeyPress += new KeyPressEventHandler(textBoxPlayerName_KeyPress);
        this.textBox.LostFocus += new EventHandler(textBoxPlayerName_LostFocus);
    }

    private void textBoxPlayerName_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter && !(String.IsNullOrEmpty(this.textBox.Text)))
        {
            this.linkLabel.Text = this.textBox.Text;
            this.textBox.Hide();
            this.linkLabel.Show();
        }
    }

    private void textBoxPlayerName_LostFocus(object sender, EventArgs e)
    {
        if (!(String.IsNullOrEmpty(this.textBox.Text)))
        {
            this.linkLabel.Text = this.textBox.Text;
            this.textBox.Hide();
            this.linkLabel.Show();
        }
        else
        {
            this.textBox.Focus();
        }
    }
}

它是一个LinkLabel ==>文本框控件,它的工作率约为95%,这是问题,当用户输入cliks linklabel,并将其转换为文本框时,我希望它“锁定”用户输入只有文本框,否则,你可以继续点击链接标签,激活更多的文本框。我只是想知道在文本框处于活动状态时是否有办法禁用用户输入。谢谢你的帮助。

我从

改变了部分方法
{    
    this.textbox.Focus();
}

{     
     this.textBox.Hide();
     this.linkLabel.Text = "<click to add player>"; //my orginal link label text;
     this.linkLabel.Show();
}

所以这似乎有效。

3 个答案:

答案 0 :(得分:1)

您可以尝试添加一个静态的“Who have focus”变量,当您将焦点放在一个变量上时,您可以使用旧的静态变量并使其显示标签。

e.g。

private static LinkLabelTextBoxPlayerName _curSelected;
...
if(_curSelected != null)
{
    _curSelected.Blur();
}

_curSelected = this;

这假设您希望一次只打开一个文本框,而这不是正常工作的文本框。

答案 1 :(得分:1)

我会将您希望锁定用户的字段的CausesValidation属性设置为true。

然后,在Validating事件处理程序中,我将使用;

private void control_Validating(object sender, CancelEventArgs e)
{
    if( ! allowUserToLeaveControl )
      e.Cancel = true;
}

希望这适合你!

/ A

答案 2 :(得分:0)

对不起,我问过这个问题,我应该多花一点时间,这里的代码工作正常,

public partial class LinkLabelTextBoxPlayerName : UserControl
{
    public LinkLabelTextBoxPlayerName()
    {
        InitializeComponent();
        this.textBox.Hide();
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        this.linkLabel.Hide();

        this.textBox.Show();
        this.textBox.Focus();
        this.textBox.KeyPress += new KeyPressEventHandler(textBoxPlayerName_KeyPress);
        this.textBox.LostFocus += new EventHandler(textBoxPlayerName_LostFocus);
    }

    private void textBoxPlayerName_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter && String.IsNullOrEmpty(this.textBox.Text.Trim()))
        {
            this.textBox.Hide();
            this.linkLabel.Text = "<click to add player>"; //orignal text;
            this.linkLabel.Show();
        }
        else if (e.KeyChar == (char)Keys.Enter)
        {
            this.textBox.Hide();
            this.linkLabel.Text = this.textBox.Text;
            this.linkLabel.Show();
        }
    }

    private void textBoxPlayerName_LostFocus(object sender, EventArgs e)
    {
        if (!(String.IsNullOrEmpty(this.textBox.Text.Trim())))
        {
            this.textBox.Hide();
            this.linkLabel.Text = this.textBox.Text;
            this.linkLabel.Show();
        }
        else
        {
            this.textBox.Hide();
            this.linkLabel.Text = "<click to add player>"; //orginal text;
            this.linkLabel.Show();
        }
    }
}