Как передать управление сервером ASP в качестве параметра пользовательскому контролю? - PullRequest
0 голосов
/ 07 июня 2009

У меня есть gridview и usercontrol на странице, я хочу изменить gridview из usercontrol. как я могу это сделать?

А также как я могу вызывать функции на странице хоста usercontrol из usercontrol?

UPDATE:

У меня есть выпадающий список внутри этого usercontrol, когда срабатывает событие SelectedIndexChanged, я хочу, чтобы в gridview на странице хоста было DataBind ().

(Затем gridview с использованием objectdatasource прочитает выбранный элемент этого выпадающего списка и будет использовать его в качестве параметра select)

Также, если возможно сделать его как можно более общим, потому что измененный элемент управления не всегда является видом сетки ...

Спасибо

Ответы [ 4 ]

4 голосов
/ 07 июня 2009

Прежде всего, вы бы не хотели этого делать. Это противоречит концепции контроля пользователя.

Если вы хотите изменить вид сетки, используя состояние пользовательского элемента управления, вы можете выставить состояние элемента управления и заставить вид сетки вести себя в соответствии с этим состоянием.

// 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:

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

и установите контейнер элемента управления в сетку, прежде чем получить к нему доступ.

userControl.Container = 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.
}
0 голосов
/ 07 июня 2009

Вам следует предоставить открытое свойство, которое принимает идентификатор серверного элемента управления, на который вы хотите сослаться. Затем вы можете получить этот элемент управления, запросив Control.NamingContainer . Вам не следует запрашивать страницу, поскольку вы хотите получить элемент управления в текущем контексте (вы можете находиться в пользовательском контроле с элементами управления, названными так же, как страница).

Не забывайте часто пропускаемый IDReferencePropertyAttribute . Он сообщает вашему узлу разработки (обычно Visual Studio), чтобы он предоставил автозаполнение значения, используя все элементы управления в текущем контексте.

Чтобы вызвать материал на вашей содержащей странице, просто используйте свойство страницы. Вам нужно привести это к вашему определенному классу страницы, если вам нужен доступ к вашим собственным методам.

0 голосов
/ 07 июня 2009

Просто добавьте общедоступный метод к выделенному коду вашего 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();
      }
}
0 голосов
/ 07 июня 2009

РЕДАКТИРОВАТЬ: В вашем пользовательском элементе управления просто создайте публичное свойство для хранения сетки. Это свойство будет содержать ссылку на сетку на странице хоста. Например, вы можете добавить следующее к коду вашего 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...