调用分配给DDL的SelectedIndexChanged事件的方法

时间:2016-05-06 12:42:53

标签: c# asp.net drop-down-menu controls selectedindexchanged

我有一个例程,它将一些数据(来自SQL查询)放入一些控件中。有用。注意我在这个实例中只使用了两种控件 - TextBox和DropDownList。表单上有一些字段需要根据其中一个控件中的值进行设置。在数据输入期间,这通过触发SelectedIndexChanged事件发生。但我想在这个子程序中自动执行此操作。我可以看到几个不同的解决方案,其中没有一个我知道如何实现。我有一个非常俗气的解决方案,我不喜欢。我分开处理问题控制。我想修改此例程来触发SelectedIndexChanged方法,但前提是它存在。

    // Put a row's value into a control
    // 
    private void assign_value_to_control(string control_name, DataRow row, string col_name )
    {
        Control c = ControlExtensions.FindControlRecursive(this.Page, control_name);
        if (c == null)
        {
            // log an error message that control was not found?
            return;
        }

        if (row[col_name] == DBNull.Value)
        {
            // No value in the column ... don't assign value to control.
            return;
        }

        if (c is DropDownList) { ((DropDownList) c).SelectedValue = row[col_name].ToString();  }
        if (c is TextBox) { ((TextBox)c).Text = row[col_name].ToString(); }

    }

问题:在此方法中适当时触发SelectedIndexChanged事件。

解决方案1:将可选方法名称传递给例程。不知道如何在C#中实现它。对于大多数控件,没有方法,所以我会传递null,但我不知道如何传递方法的名称。

解决方案2:传递一个标志,告诉它调用特定的方法......这似乎比我目前的解决方案更加尖锐。

解决方案3:给定一个控件,查找绑定到SelectedIndexChanged事件的方法。我知道这样的事情应该是可能的,但我可以用一些帮助搞清楚。

我想知道如何实现解决方案1和解决方案3,但我的偏好是解决方案3 - 查找与该事件关联的方法,然后调用它(如果存在)。

任何指针?

我已经想出如何实施解决方案1.

private void assign_value_to_control(string control_name, DataRow row, string col_name, Action<object,EventArgs> method)
{
    Control c = ControlExtensions.FindControlRecursive(this.Page, control_name);
    if (c == null)
    {
        // log an error message that control was not found?
        return;
    }

    if (row[col_name] == DBNull.Value)
    {
        // No value in the column ... don't assign value to control.
        return;
    }

    if (c is DropDownList) { ((DropDownList) c).SelectedValue = row[col_name].ToString();  }
    if (c is TextBox) { ((TextBox)c).Text = row[col_name].ToString(); }

    if (method == null)
    {
        Class1.WebAudit("debug1", "null method passed to assign_value_to_control()");
    }
    else
    {
        Class1.WebAudit("debug1", "method passed to assign_value_to_control()");
        method(c, EventArgs.Empty);
    }

}

然后我调用:

assign_value_to_control("ddlQ7" + rowNumber, row, "MeasurementUnits", ddlQ7_SelectedIndexChanged)

调用方法或

assign_value_to_control("ddlQ7" + rowNumber, row, "MeasurementUnits", null)

在不调用任何方法的情况下分配值。

我想我仍然更喜欢在解决方案3中做到这一点(我仍然不知道该怎么做)。

0 个答案:

没有答案