Пройдите вверх через вложенные элементы управления Ajax.Проверка типов и FindControl - PullRequest
0 голосов
/ 26 апреля 2011

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

protected void grandChildAccordion_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e)
{
    if (e.AccordionItem.ItemType == AjaxControlToolkit.AccordionItemType.Header)
    {
         // find parent accordion
    }
}

Иногда родительский аккордеон находится на уровне e.AccordionItem.Parent.Parent.Parent или e.AccordionItem.Parent.Parent..Parent.Parent level.

Итак, как мне проверить, равен ли e.AccordionItem.Parent AjaxControlToolkit.AccordionContentPanel «тип»?

(не такой элегантный) Решение: У меня есть вложенные аккордеоны, самый глубокий уровень аккордеона содержит списки документов, а каждый заголовок аккордеона имеетметка, показывающая количество документов, вложенных в нее.Начиная с самого глубокого уровня аккордеона, где я получаю количество документов, я просматриваю вложенные аккордеоны и нахожу каждый заголовок аккордеона, что позволяет мне найти их метку количества документов и добавить к ней значение ... надеюсь, это кому-нибудь поможет:

// Save doc count. It will be displayed in doc count label within current accordion header, and the value will then be added to the doc count of each parent accordion's header.
int curDocCount = qcDocsBO.FetchQCDocumentCountByProjectID(SessionHandler.ProjectID, qcDocsBO.LSDItemID);
lblDocCount.Text = curDocCount.ToString();

// A deep-most accordion has just been DataBound. Start traversing upwards through nested accordions, adding the doc count to each parent accordion header's doc count label.
AjaxControlToolkit.Accordion curAccordion = sender as AjaxControlToolkit.Accordion;
AjaxControlToolkit.AccordionPane parentAccCP = curAccordion.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;
if (parentAccCP == null)
    parentAccCP = curAccordion.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;
while (parentAccCP != null)
{
    Label parentDocCountLabel = (Label)parentAccCP.FindControl("lblDocCount");
    if (parentDocCountLabel.Text == "")
        parentDocCountLabel.Text = "0";
    parentDocCountLabel.Text = (Convert.ToInt32(parentDocCountLabel.Text) + curDocCount).ToString();

    AjaxControlToolkit.AccordionPane nextParentAccCP = parentAccCP.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;

    if (nextParentAccCP == null)
        nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;
    if (nextParentAccCP == null)
        nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;
    if (nextParentAccCP == null)
        nextParentAccCP = parentAccCP.Parent.Parent.Parent.Parent.Parent.Parent as AjaxControlToolkit.AccordionPane;
    if (nextParentAccCP != null)
        parentAccCP = nextParentAccCP;
    else
        parentAccCP = null;
}

1 Ответ

0 голосов
/ 26 апреля 2011

Вы всегда можете делать проверки типов, используя ключевое слово is или безопасное приведение, используя ключевое слово as.

Учитывайте следующее:

if(e.AccordionItem.Parent is AjaxControlToolkit.AccordionContentPanel) {
   ...
}

или это

var accordion = e.AccordionItem.Parent as AjaxControlToolkit.AccordionContentPanel;
if(accordion != null) {
   ...
}

accordion равно нулю, если безопасное приведение не было успешным.

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

...