我有一个例程,它将一些数据(来自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中做到这一点(我仍然不知道该怎么做)。