【问题标题】:NumericUpDown ValueChanged preventDefault?NumericUpDown ValueChanged preventDefault?
【发布时间】:2017-07-05 09:54:30
【问题描述】:

我想创建一个表单,允许用户在五个不同的字段 (NumericUpDown) 中设置一定数量的点。当该点数达到 0 时,用户无法再添加。 (不过,我仍然希望用户能够删除积分。)

到目前为止,这是我的代码:

private void calculateValue() {
  decimal tempValue = CMB_num_Aim.Value + CMB_num_Reflexes.Value + 
  CMB_num_Positioning.Value + CMB_num_Movement.Value + CMB_num_Teamwork.Value;
  controlValue = currentValue - tempValue;
  MyBox.CMB_tb_cv.Text = controlValue.ToString();
}

这个方法(calculateValue)是计算用户还剩多少点(controlValue)。

private void CMB_num_Aim_ValueChanged(object sender, EventArgs e) {
  calculateValue();
  if (controlValue < 0) {
     //Prevent Default here
     MessageBox.Show("You are out of points!");
  }
}

此方法 (CMB_num_Aim_ValueChanged) 在 NumericUpDown 控件的值发生更改时触发。每个字段我都有一个,每个都做同样的事情。

该方法按预期触发,但我无法阻止它发生 - 用户可以应用比他们拥有的更多的点。如何防止用户申请更多积分?

(我想过做一个mouseUp方法,但不知道用户是用鼠标还是用键盘输入值。)

【问题讨论】:

  • 使用属性将最小金额设置为零
  • 您可以通过设置之前的值来阻止,存储之前的值并在 valuechanged 事件中重新设置
  • 克里希纳 - 我想过这样做,但我还没有找到可靠的方法来做到这一点,而不会意外地用刚刚触发的那个覆盖我的“oldValue”。
  • 在 Tag 属性中保留旧值,这样您就不需要维护变量。只要验证正确,就更新标签属性
  • 这听起来与this question 类似的关于 ComboBox 控件的问题。有时提供的控件在功能上有点缺乏,扩展它们可能是一个好方法。

标签: c#


【解决方案1】:

似乎您想在一些技能之间创建一个点分配系统 - 目标、移动、团队合作等。您可以通过在输入时设置 Maximum 值控制 NumericUpDown 轻松做到这一点。将所有技能 updown 控件订阅到同一个事件处理程序:

private void SkillNumericUpDown_Enter(object sender, EventArgs e)
{
   var skill = (NumericUpDown)sender;
   var availablePoints = 42;
   var maxSkillPoints = 20; // usually you cannot assign all points to one skill
   var unassignedPoints = availablePoints - SkillPointsAssigned;
   skill.Maximum = Math.Min(maxSkillPoints, unassignedPoints  + skill.Value);

   if (unassignedPoints == 0)
   {
       MessageBox.Show("You are out of points!");
       return;
   }

   if (skill.Value == maxSkillPoints)
   {
       MessageBox.Show("Skill maximized!");
       return;
   }
}

private decimal SkillPointsAssigned =>
    CMB_num_Aim.Value + 
    CMB_num_Reflexes.Value + 
    CMB_num_Positioning.Value + 
    CMB_num_Movement.Value + 
    CMB_num_Teamwork.Value;

好处 - 您将无法通过箭头或手动输入非法值。

【讨论】:

    【解决方案2】:

    替换

    if (controlValue < 0) {
    

    if (controlValue <= 0) {
    

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多