Перепривязать RadTreeView из другого пользовательского элемента управления

У меня есть контроль пользователя GrandParent top.asxc. Внутри у меня есть контроль RadSplitter, который делит страницу на 2 раздела. В левой части я загружаю элемент управления Left.ascx, внутри которого есть radTreeView, а справа - right.ascx. На элементе управления right.ascx у меня есть кнопка, и когда я щелкаю по ней, я хочу привязать Databind к элементу управления radTreeView, который находится на элементе управления left.ascx. Это способ сделать это?

1 ответ

Вам нужно передать событие из right.ascx UserControl на top.ascx UserControl, Тогда top.ascx UserControl вызовет нужное вам событие, так как в top.ascx есть экземпляр left.ascx. Вот как...

В файле right.ascx.cs:

public event EventHandler RightButton_Clicked;

protected void RightButton_Click(object sender, EventArgs e)
{
    EventHandler handler = RightButton_Clicked;

    if (handler != null)
    {
        handler(this, new EventArgs());
    }
}

В файле top.ascx.cs:

private static Control _leftUC;
private static Control _rightUC;

protected override void OnInit(EventArgs e)
{
     base.OnInit(e);
     InitWebUserControls();
}

// Note: if your UserControl is defined in the ascx Page, use that definition
//       instead of the dynamically loaded control `_right_UC`. Same for `_leftUC`
private void InitWebUserControls()
{
     _leftUC = Page.LoadControl("left.ascx");
     _rightUC = Page.LoadControl("right.ascx");
     ((right)_rightUC).RightButton_Clicked += new EventHandler(RightUC_Event);
}

void RightUC_Event(object sender, EventArgs e)
{
     ((left)_leftUC ).UpdateControl();
}

В файле left.ascx:

public void UpdateControl()
{
     leftRadTreeView.Rebind();
}   

Если вы в конце концов захотите передать аргумент события в top.ascx UserControl, Вместо того, чтобы использовать new EventArgs() использовать пользовательский класс, который реализует EventArgs и используйте это так:

int myArgument = 1;
handler(this, new RightEventArgs(myArgument));

public class RightEventArgs: EventArgs
{
    public int argumentId;

    public RightEventArgs(int selectedValue)
    {
        argumentId = selectedValue;
    }
}

И тогда вы можете отфильтровать события, которые были переданы в top.ascx, проверив его EventArgs тип бетона:

private void InitWebUserControls()
{
     _leftUC = Page.LoadControl("left.ascx");
     ((left)_leftUC ).LeftButton_Clicked += new EventHandler(Child_Event);
     _rightUC = Page.LoadControl("right.ascx");
     ((right)_rightUC).RightButton_Clicked += new EventHandler(Child_Event);
}

void Child_Event(object sender, EventArgs e)
{
     if( e is RightEventArgs)
     {
          ((left)_leftUC).UpdateControl();
     }
     else if (e is LeftEventArgs)
     {
          ((right)_rightUC).ClearSelection();
     }
}
Другие вопросы по тегам