Получение значения параметра

284
12 сентября 2017, 06:46

Здравствуйте. Вручную вызываю в коде программы обработчик события dropdownlist и передаю туда параметры. В качестве sender передаю массив из двух элементов типа object.

object[] mas = new object[2];
mas[0] = "Home.aspx";
mas[1] = ddlSelUnit.SelectedItem.Text;
ddlSelAggregate_SelectedIndexChanged(mas, null);

Как мне в обработчике событий взять эти параметры? Sender[0], так нельзя. А как по другому обратиться к каждому из элементов массива я что то не могу понять.

Answer 1

Вы решаете проблему не в том направлении. Обработчик события - это не какая-то магия, это просто метод с определенной сигнатурой, приспособленный для реакции на события. Вы же не реагируете на событие, вы просто вызываете свой код.

Вызов ddlSelAggregate_SelectedIndexChanged тут не нужен - в ddlSelAggregate_SelectedIndexChanged должен быть написан код, реагирующий на событие "смена индекса выделенного элемента в ddlSelAggregate. И в параметрах он должен ожидать вызвавший эту смену дропдаун (ddlSelAggregate) и пустые event args. Если он начнет ожидать вторым параметром какой-то кастомный объект - ваш код некрасиво упадет с InvalidCastException при вызове реального события SelectedIndexChanged у реального контрола ddlSelAggregate - т.к. стандартный дропдаун вообще не в курсе, что вы ожидаете вторым параметром какой-то MyArgs. По сути, в соседних ответах вам советуют решение, которое

  • Или упадет при вызове события SelectedIndexChanged у ddlSelAggregate (если вы на него подписаны)
  • Или решает проблему вызова вашего же кода из вашего же кода через неудобную сигнатуру метода и абсолютно ненужный каст (если ddlSelAggregate_SelectedIndexChanged не подписан на 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 
               // при натуральном (не "ручном") вызове
                      );
}
Answer 2

Параметры желательно передавать как аргументы, а не как отправителя события. Для этого:

Делаем класс для аргументов

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

Answer 3

Создайте новый класс с нужными вам полями:

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;
        ....
    }

Можно еще привести объект к массиву объектов, но это плохой подход.

Лучше передать свой объект в обработчик как аргумент, как это сделать описано в соседнем ответе.

READ ALSO
Выгрузка данных с цветом в Excel

Выгрузка данных с цветом в Excel

Выгружаются данные из dataGridView в Excel всё нормально при экспорте цвета проблема с белым цветом, все столбцы где есть белый цвет выгружаются черными

224
Русский язык в консоли Windows Mobile 5.0 (.net compact 3.5)

Русский язык в консоли Windows Mobile 5.0 (.net compact 3.5)

Нужно, чтобы в консоли выводились русские символы, но параметра OutputEncoding у класса Console нетуКак установить русский язык? Может нужно что-то...

314
анимация пунктира в svg

анимация пунктира в svg

Есть пунктир в svgАнимация должна идти в обе стороны до определенной точки, которая зависит от какого-то параметра (положение слайдера, введенное...

327