【问题标题】:event handling in c# .net winform application which uses sql server使用 sql server 的 c# .net winform 应用程序中的事件处理
【发布时间】:2011-07-11 00:07:45
【问题描述】:

我有一个包含 SQLuser 列表的组合框,这些用户具有预先授予的权限。 一个表 PERMISSION_DETAIL 与列 username, permission_name 包含授予或拒绝权限的详细信息

现在,当用户从组合框中选择 SQLuser 时,权限会显示为复选框,例如,如果权限已被授予,则会出现复选框并选中它的勾号,否则为 UNCHECKED。

为此我使用:

if(permission is previously granted)

checkbox1.checked = true;   // here the Checkbox_CheckChanged event is called, but i dont want to call it.
checkbox1.enabled = false;

现在,除了复选框之外,还有一个按钮,点击它,复选框被启用,即修改权限,用户将点击按钮。

现在用户将勾选或取消勾选复选框以授予或拒绝权限以及复选框更改事件

会被调用,这样就好了。

我希望当复选框出现时,它的勾号会被自动选中,但这会调用 checkbox_Checkchanged 事件,但我不想调用该事件。

【问题讨论】:

  • 不要在表单中添加任何标志变量。如果项目很棒,将很难(努力)控制它。看我的帖子

标签: c# .net sql sql-server sql-server-2005


【解决方案1】:

我建议您将 Checkbox_CheckChanged 事件更改为 Checkbox_Click 事件。

private void Checkbox_Click(object sender, EventArgs e)
        {
            if ((sender as CheckBox).Checked)
            {
                MessageBox.Show("checked");
                // add role to user
            }
            else
            {
                MessageBox.Show("un_checked");
                /remove role ffrom user
            }
        }

【讨论】:

    【解决方案2】:

    无论如何都会调用该事件,重要的是您如何处理该事件。一个事件发生了,你不能假装它没有。您唯一能做的就是确定该事件在特定时间点对您是否有意义。

    例如:

    public void chkPermission_CheckChanged(object sender, EventArgs e)
    {
        bool isChecked = chkPermission.Checked;
        if (this.user.HasPermission() == isChecked) { return; }
        // otherwise, we need to change some permissions!
    }
    

    分析您是否需要做任何事情,然后从那里开始。不要仅仅因为事件触发而盲目地假设某些事情需要更改。

    【讨论】:

      【解决方案3】:

      您可以在 EventHandler 中执行任何操作之前检查复选框是否已启用:

      protected void Checkbox_CheckChanged (object sender, ..EventArgs e)
      {
          //return if not enabled
          if(!((CheckBox)sender).IsEnabled) return;
      
          //DO THE REST
      }
      

      我认为如果你为 CheckChanged 做一个事件处理程序,它应该总是在“检查被更改”时调用,然后你应该处理之后的逻辑。

      【讨论】:

      • 先生,如果我使用:if(checkbox1.enabled==true) -- 那么有什么不同吗?我的意思是在你发布的查询和这个?
      • @sqlchild:不,没有区别。 (CheckBox)sender 与本例中的 checkbox1 相同。我的代码使它“更安全”,我以后想更改 checkbox1 的名称,因为它适用于任何名称。
      【解决方案4】:

      在表单中添加一个布尔变量 IsCheckboxEventShouldFire。最初设置为 true。在将复选框设置为自动选中的代码中,现在还将 IsCheckboxEventShouldFire 设置为 false。在 checkchanged 事件中,首先检查 IsCheckboxEventShouldFire 是否为真。如果是,请运行您的代码。如果没有,那就不要。在事件代码的末尾将 IsCheckboxEventShouldFire 设置为 true。

      【讨论】:

      • 在这种情况下添加另一个布尔标志是一个坏主意。应将检查值与相关用户的当前权限状态进行比较。否则,您的标志将不同步。
      • 我不同意。你假设他想检查一下任务是什么。我假设他想检查事件是由于用户操作还是由代码引起的。在这种情况下,布尔变量就是答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多