我在页面上有一个gridview和usercontrol,我想从usercontrol改变gridview。我怎么能这样做?
还有如何从usercontrol中调用usercontrol的“主机”页面中的函数?
更新
我在这个usercontrol中有一个下拉列表,当它的SelectedIndexChanged事件被触发时,我希望主页上的gridview为DataBind()。
(然后,使用objectdatasource的gridview将读取此下拉列表选定项并将其用作选择参数)
此外,如果可以尽可能地使其尽可能通用,因为改变的控制并不总是网格视图......
由于
答案 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属性。如果需要访问自己的方法,则需要将其强制转换为特定的页面类。