如何将ASP服务器控件作为参数传递给usercontrol?

时间:2009-06-07 15:47:45

标签: c# asp.net user-controls

我在页面上有一个gridview和usercontrol,我想从usercontrol改变gridview。我怎么能这样做?

还有如何从usercontrol中调用usercontrol的“主机”页面中的函数?

更新

我在这个usercontrol中有一个下拉列表,当它的SelectedIndexChanged事件被触发时,我希望主页上的gridview为DataBind()。

(然后,使用objectdatasource的gridview将读取此下拉列表选定项并将其用作选择参数)

此外,如果可以尽可能地使其尽可能通用,因为改变的控制并不总是网格视图......

由于

4 个答案:

答案 0 :(得分:4)

首先,你不想做任何事。这违背了用户控制的概念。

如果要使用用户控件的状态修改gridview,可以公开控件的状态并使gridview根据此状态运行。

// This handles rowdatabound of gridview
OnRowDataBound(object sender, RowDataBoundEventArgs e)
{
    var control = e.Row.Find("UserControlId");
    if (control.SomeProperty == SomeValue)
        someTextBox.Value = "something";
}

如果您确实需要将gridview的句柄传递给用户控件,请在网格视图类型的用户控件上定义属性:

// This is a property of user control
public GridView Container { get; set; }

并在访问之前将控件的容器设置为gridview。

userControl.Container = gridView;

如果用户控件是网格上的itemtemplate的一部分,由于在创建gridview的行时创建了用户控件,因此只有在绑定gridview之后才能创建用户控件。

最后,为了在容器页面上调用函数,您可以在用户控件内部公开事件并绑定到该事件。

public delegate void SomethingHappenedEventHandler(object sender, EventArgs e);

// In user control:
public event SomethingHappenedEventHandler SomethingHappened;

// Trigger inside a method in user control:
SomethingHappenedEventHandler eh = SomethingHappened;
if (eh != null) eh(this, EventArgs.Empty);

// In page:
userControl.SomethingHappened = new SomethingHappendEventHandler(OnSomething);

private void OnSomething(object sender, EventArgs e)
{
    // When something happens on user control, this will be called.
}

答案 1 :(得分:0)

编辑:在您的用户控件中,只需创建一个公共属性来保存网格。然后,该属性将在主机页面中保存对网格的引用。例如,您可以将以下内容添加到UserControl的代码中。

public string CurrentGridID
{
  get;
  set;
}

public void ModifyGrid()
{
  //make changes to the grid properties
  GridView grid = Page.FindControl(CurrentGridID);
  grid.AutoGenerateColumns = false;
}

从您托管控件的页面,您可以执行以下操作。

protected void Page_Load(object source, EventArgs e)
{
   this.myUserControl1.CurrentGridID = this.gridView1.ID;
}

答案 2 :(得分:0)

只需在usercontrol的代码隐藏中添加一个公共方法,然后就可以从页面调用它并将gridview作为参数传递:

public class MyUserControl : UserControl
{
  public void MyMethod(GridView gridview)
  {
    // do stuff with the gridview
  }
  ...
}

第二个问题有点复杂。因为如果您使用户控件依赖于特定页面,它将不再可以在其他页面上重复使用,例如:

public class MyUserControl : UserControl
{
  public void AnotherMethod()
  {
     //get the current page and cast it to its type
     MyPage page = this.Page as MyPage;
     // now I can call the public methods of MyPage
     page.SomeMethod();
  }
  ...
}

更好的解决方案是定义一个由页面实现的接口。然后,您可以通过将当前页面强制转换为接口来实现该接口的方法(并且控件仍然可以在实现相同接口的其他页面上重用):

public interface IMyInterface
{
  void SomeMethod();
}
public class MyPage : IMyInterface
{
  public void SomeMethod() { ... }
}
public class MyUserControl : UserControl
{
      public void AnotherMethod()
      {
         //get the current page and cast it to the interface
         IMyInterface page = this.Page as IMyInterface;
         // now I can call the methods of the interface
         if (page != null) page.SomeMethod();
      }
}

答案 3 :(得分:0)

您应该公开一个接受您要引用的服务器控件的id的公共属性。然后,您可以通过查询Control.NamingContainer来获取该控件。您不应该查询Page,因为您想要在当前上下文中获取控件(您可以在具有与页面相同的控件的用户控件中)。

不要忘记经常被忽视的IDReferencePropertyAttribute。它告诉你的designhost(通常是Visual Studio)使用当前上下文中的所有控件为值提供自动完成。

要在包含的页面上调用内容,只需使用Page属性。如果需要访问自己的方法,则需要将其强制转换为特定的页面类。