C # _Click Event Casting Sender и использование FindControl - PullRequest
0 голосов
/ 28 февраля 2009

У меня есть событие _Click, которое срабатывает при нажатии на график. В этом случае я немедленно приведу отправителя к типу Chart. Я часто придерживаюсь этой парадигмы, но чувствую, что чувствую отвращение при каждом своем поступке.

В этом конкретном случае я также немедленно выбегаю, чтобы найти соответствующую UpdatePanel, чтобы я мог добавить к ней динамически отображаемый GridView. Chart и UpdatePanel объединяются, имея одинаковые идентификаторы. И диаграмма, и панель обновления динамически создаются во время выполнения.

Мне интересно, есть ли лучший / предпочтительный способ реализации такого поведения.

protected void Chart_Click(object sender, ImageMapEventArgs e)
{
    Chart chart = (Chart)sender;
    UpdatePanel up = (UpdatePanel)chart.Parent.FindControl(chart.ID + "UP");

    GridView gv = new GridView();
    Dictionary<string, string> displayFields =
        new Dictionary<string, string>();

    // add data to displayFields by using the ImageMapEventArgs.PostBackValue
    // to create data for dictionary ...

    gv.DataSource = displayFields;
    gv.DataBind();
    up.ContentTemplateContainer.Controls.Add(gv);
}

Ответы [ 4 ]

3 голосов
/ 28 февраля 2009

Я не уверен, что еще можно сделать при приведении отправителя к диаграмме (кроме использования as), но есть много способов справиться с проблемой связанных элементов управления.

  • Добавить свойство в таблицу под названием «LinkedPanel» и назначьте ей панель обновления

    Вы увидите похожий шаблон, используемый в значке уведомлений, где вы связываете его с контекстным меню )

    Я думаю, что это особенно приятно, потому что, когда все сделано правильно, вы можете просто назначить связанный элемент управления в конструкторе форм. (Конечно, это не поможет с вашими динамически генерируемыми элементами управления)

  • Объедините оба элемента управления в один UserControl (если элементы управления всегда отображаются рядом друг с другом, это может быть правильным решением)

  • Создайте объект, который знает об обоих элементах управления, и пусть он обрабатывает события, которые они вызывают

Я согласен, что в зависимости от имени просто чувствует себя не так; Я был бы слишком смущен / нервничать, чтобы использовать его в производственном коде: - / (Если вы единственный разработчик, тогда, я думаю, вам решать ...)

Использование этих других подходов снижает вероятность того, что «невинные изменения», сделанные другим разработчиком, начнут вызывать неожиданные исключения.

1 голос
/ 28 февраля 2009

Использовать как вместо.

Ваш бросок бросит в случае неудачи.

Chart chart = sender as Chart;
if (chart == null)
   return; // or do something else

// the rest of your handler.
1 голос
/ 28 февраля 2009

Я думаю, что безопасно преобразовать отправителя в Chart, потому что вы знаете, что это всегда Chart. Обратите внимание, что имя метода чётно Chart_Click.

Однако вы можете сохранить ссылку на UpdatePanel в свойстве Chart Tag. Это сохраняет уродство и риск поиска имени в родительском. Может быть трудно поддерживать, если вы постоянно меняете родителей или перемещаете панели.

Если вы знаете, 100% , которые UpdatePanel будут там и названы правильно, тем не менее, в вашем подходе нет ничего «неправильного» ИМХО Возможно, вы захотите добавить комментарий «не меняйте это имя» рядом со строкой UpdatePanel.Name =, где вы его инициализируете, хотя для безопасности. (Кстати, если вы не единственный, у кого есть доступ к вашему коду, 100% мгновенно падает до не более 99,9%.)

0 голосов
/ 28 февраля 2009

Нет ничего действительно плохого в том, что вы сделали. Но вы можете предотвратить ошибку приведения типов, используя 'as' вместо явного приведения, следующим образом.

если вы хотите узнать, является ли элемент управления панелью обновления, вы можете сделать это, используя GetType() метод

Пример: sender.GetType().name даст вам имя элемента управления

protected void Chart_Click(object sender, ImageMapEventArgs e)
{
    Chart chart = (Chart)sender;
    control c = Parent.FindControl(chart.ID + "UP");
    UpdatePanel up ;

    if (c != null)
    {
       up = c as UpdatePanel;**


       GridView gv = new GridView();
       Dictionary<string, string> displayFields =
           new Dictionary<string, string>();

       // add data to displayFields by using the ImageMapEventArgs.PostBackValue
       // to create data for dictionary ...

       gv.DataSource = displayFields;
       gv.DataBind();
       up.ContentTemplateContainer.Controls.Add(gv);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...