C# 如何将ASP服务器控件作为参数传递给usercontrol?
我在页面上有一个gridview和usercontrol,我想从usercontrol更改gridview。我该怎么做 以及如何从usercontrol调用usercontrol“主机”页面中的函数 更新:C# 如何将ASP服务器控件作为参数传递给usercontrol?,c#,asp.net,user-controls,C#,Asp.net,User Controls,我在页面上有一个gridview和usercontrol,我想从usercontrol更改gridview。我该怎么做 以及如何从usercontrol调用usercontrol“主机”页面中的函数 更新: 我在这个usercontrol中有一个dropdownlist,当触发it's SelectedIndexChanged事件时,我希望主机页上的gridview成为DataBind() (然后,使用objectdatasource的gridview将读取此dropdownlist选定项并将其
我在这个usercontrol中有一个dropdownlist,当触发it's SelectedIndexChanged事件时,我希望主机页上的gridview成为DataBind() (然后,使用objectdatasource的gridview将读取此dropdownlist选定项并将其用作选择参数) 此外,如果可能使其尽可能通用,因为更改后的控件并不总是gridview
谢谢编辑:在您的用户控件中,只需创建一个公共属性来保存网格即可。然后,该属性将在主机页中保存对网格的引用。例如,您可以将以下内容添加到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;
}
编辑:在用户控件中,只需创建一个公共属性来保存网格。然后,该属性将在主机页中保存对网格的引用。例如,您可以将以下内容添加到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;
}
首先,你两个都不想做。这违背了用户控制的概念 如果要使用用户控件的状态修改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句柄传递给用户控件,请在grid view类型的用户控件上定义属性:
// 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.
}
首先,你两个都不想做。这违背了用户控制的概念 如果要使用用户控件的状态修改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句柄传递给用户控件,请在grid view类型的用户控件上定义属性:
// 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.
}
只需将一个公共方法添加到usercontrol的代码隐藏中,即可从页面调用该方法并将gridview作为参数传递:
public class MyUserControl : UserControl
{
public void MyMethod(GridView gridview)
{
// do stuff with the gridview
}
...
}
第二个问题有点复杂。因为如果您使usercontrol依赖于特定页面,它将不再可在其他页面上重用,例如:
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();
}
...
}
更好的解决方案是定义一个由页面实现的接口。然后,您可以通过将当前页面强制转换为该接口的方法(并且这些控件仍然可以在实现相同接口的其他页面上重用):
只需将一个公共方法添加到usercontrol的代码隐藏中,即可从页面调用该方法并将gridview作为参数传递:
public class MyUserControl : UserControl
{
public void MyMethod(GridView gridview)
{
// do stuff with the gridview
}
...
}
第二个问题有点复杂。因为如果您使usercontrol依赖于特定页面,它将不再可在其他页面上重用,例如:
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();
}
...
}
更好的解决方案是定义一个由页面实现的接口。然后,您可以通过将当前页面强制转换为该接口的方法(并且这些控件仍然可以在实现相同接口的其他页面上重用):
您应该公开一个公共属性,该属性接受要引用的服务器控件的id。然后可以通过查询来获取该控件。您不应该查询页面,因为您希望在当前上下文中获取该控件(您可能位于一个usercontrol中,其中的控件名与页面相同) 不要忘记那些经常被忽视的事情。它告诉designhost(通常是Visual Studio)使用当前上下文中的所有控件为值提供自动完成
要调用包含页面上的内容,只需使用Page属性。如果需要访问自己的方法,则需要将其强制转换为特定的page类。您应该公开一个公共属性,该属性接受要引用的服务器控件的id。然后可以通过查询来获取该控件。您不应该查询页面,因为您希望在当前上下文中获取该控件(您可能位于一个usercontrol中,其中的控件名与页面相同) 不要忘记那些经常被忽视的事情。它告诉designhost(通常是Visual Studio)使用当前上下文中的所有控件为值提供自动完成
要调用包含页面上的内容,只需使用Page属性。如果需要访问自己的方法,则需要将其强制转换到特定的页面类。这样做的缺点是无法以声明方式将网格视图映射到用户控件。ASP.NET中使用的通常模式(在验证控件和数据源中)是将ID作为字符串传递,并让子控件查找。这有一个缺点,即无法以声明方式将网格视图映射到用户控件。ASP.NET中使用的通常模式(在验证控件和数据源中)是将ID作为字符串传递,并让子控件查找该内容