Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将ASP服务器控件作为参数传递给usercontrol?_C#_Asp.net_User Controls - Fatal编程技术网

C# 如何将ASP服务器控件作为参数传递给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选定项并将其

我在页面上有一个gridview和usercontrol,我想从usercontrol更改gridview。我该怎么做

以及如何从usercontrol调用usercontrol“主机”页面中的函数

更新:


我在这个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作为字符串传递,并让子控件查找该内容