Здравствуйте. Вручную вызываю в коде программы обработчик события dropdownlist и передаю туда параметры. В качестве sender передаю массив из двух элементов типа object.
object[] mas = new object[2];
mas[0] = "Home.aspx";
mas[1] = ddlSelUnit.SelectedItem.Text;
ddlSelAggregate_SelectedIndexChanged(mas, null);
Как мне в обработчике событий взять эти параметры? Sender[0], так нельзя. А как по другому обратиться к каждому из элементов массива я что то не могу понять.
Вы решаете проблему не в том направлении. Обработчик события - это не какая-то магия, это просто метод с определенной сигнатурой, приспособленный для реакции на события. Вы же не реагируете на событие, вы просто вызываете свой код.
Вызов ddlSelAggregate_SelectedIndexChanged тут не нужен - в ddlSelAggregate_SelectedIndexChanged должен быть написан код, реагирующий на событие "смена индекса выделенного элемента в ddlSelAggregate. И в параметрах он должен ожидать вызвавший эту смену дропдаун (ddlSelAggregate) и пустые event args. Если он начнет ожидать вторым параметром какой-то кастомный объект - ваш код некрасиво упадет с InvalidCastException при вызове реального события SelectedIndexChanged у реального контрола ddlSelAggregate - т.к. стандартный дропдаун вообще не в курсе, что вы ожидаете вторым параметром какой-то MyArgs. По сути, в соседних ответах вам советуют решение, которое
SelectedIndexChanged у ddlSelAggregate (если вы на него подписаны)SelectedIndexChanged у ddlSelAggregate, а называется так просто так, и сигнатура у него просто так задана в виде обработчика события)Если же ddlSelAggregate_SelectedIndexChanged больше не вызвается в качестве реакции на SelectedIndexChanged у ddlSelAggregate - то почему у него до сих пор такое имя и сигнатура? Это же ваш код, он следует вашим правилам - поменяйте сигнатуру на удобную вам. И имя вместе с ней, чтобы оно не вводило в заблуждение.
Если вам нужно передать в кусок своего кода два параметра - вынесите этот кусок кода в отдельный метод, и передавайте в него значения:
void ChangeSelectedUnit(string someUrl, string unit)
{
// тут ваш код, работающий с "home.aspx" и unit
}
Вызов:
ChangeSelectedUnit(someUrl, unit);
Если этот же код нужно вызывать на смене ddlSelAggregate_SelectedIndexChanged - в теле ddlSelAggregate_SelectedIndexChanged соберите нужные вам параметры из контролов, и вызовите тот же ChangeSelectedUnit:
protected void ddlSelAggregate_SelectedIndexChanged(object sender, System.EventArgs e)
{
ChangeSelectedUnit(
// тут someUrl и unit, которые сейчас у вас используются в коде ddlSelAggregate_SelectedIndexChanged
// при натуральном (не "ручном") вызове
);
}
Параметры желательно передавать как аргументы, а не как отправителя события. Для этого:
Делаем класс для аргументов
public class MyArgs : EventArgs
{
public object param1 { get; set;}
public object param2 { get; set;}
/* тут всё, что хотите передать */
}
Отправляем аргументы как аргументы
ddlSelAggregate_SelectedIndexChanged(this, new MyArgs() {param1=/**/, param2=/**/});
И работаем с ними так
private void ddlSelAggregate_SelectedIndexChanged(object sender, System.EventArgs e)
{
var myObject = e as MyArgs; // проверка что тип параметра именно тот, что вы ожидаете
if (myObject!=null)
{
var param1 = myObject.param1;
var param2 = myObject.param2;
}
}
UPD. Тут рассматривается только способ передачи аргументов в обработчик события. Вопросы зачем это вообще делать не рассматриваются, так как есть множество вариантов как решить ту или иную проблему. Подробнее в ответе от @PashaPash
Создайте новый класс с нужными вам полями:
public class MyType
{
public string param1 { get; set; }
public string param2 { get; set; }
}
Создайте экземпляр класса, внесите в его поля нужные значения и передайте в обработчик:
var mas = new MyType()
{
param1 = "Home.aspx",
param2 = ddlSelUnit.SelectedItem.Text
};
ddlSelAggregate_SelectedIndexChanged(mas, null);
В обработчике приведите Object к вашему типу, тогда вы сможете получить значения полей объекта:
private void ddlSelAggregate_SelectedIndexChanged(object sender, System.EventArgs e)
{
var myObject = (MyType)sender;
var param1 = myObject.param1;
var param2 = myObject.param2;
....
}
Можно еще привести объект к массиву объектов, но это плохой подход.
Лучше передать свой объект в обработчик как аргумент, как это сделать описано в соседнем ответе.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей