Получить событие клика от кнопки ссылки в композитном контроле в веб-формах - PullRequest
0 голосов
/ 06 декабря 2018

Я создал составной элемент управления, который содержит несколько элементов мозаичного изображения (которые также являются пользовательскими элементами управления).На моей веб-странице я хочу поймать событие щелчка плитки, но не могу понять, как.

Это TileButton: (компоненты могут быть спроектированы динамически, но я оставил эту часть внедля простоты)

public class TileButton : LinkButton
{
   public string Title { get; set; }
   public string ImageUrl { get; set; }

   private System.Web.UI.WebControls.Label title = 
       new System.Web.UI.WebControls.Label();
   private Image image = new Image();


   protected override void CreateChildControls()
   {
      base.CreateChildControls();
      title.Text = Title;
      image.ImageUrl = ImageUrl;
      Controls.Add(title);
      Controls.Add(image);
   }

   protected override void RenderContents(HtmlTextWriter writer)
   {
       RenderTitle(writer);
       RenderImage(writer);
   }

   private void RenderImage(HtmlTextWriter writer) 
   {
       writer.AddAttribute(HtmlTextWriterAttribute.Class, 
           "some css classes");
       writer.RenderBeginTag(HtmlTextWriterTag.Div);
       image.RenderControl(writer);
       writer.RenderEndTag();
   }

   private void RenderTitle(HtmlTextWriter writer)
   {
       writer.AddAttribute(HtmlTextWriterAttribute.Class, 
           "other css classes");
       writer.RenderBeginTag(HtmlTextWriterTag.Div);
       writer.AddAttribute(HtmlTextWriterAttribute.Class, 
           "title css classes");
       writer.RenderBeginTag(HtmlTextWriterTag.H6);
       title.RenderControl(writer);
       writer.RenderEndTag();
       writer.RenderEndTag();
   }
}

Это составной элемент управления:

public class TilesControl : CompositeDataBoundControl
{
   public List<TileButton> TileButtons { get; set; } = 
       new List<TileButton>();

   protected override int CreateChildControls(IEnumerable datasource, bool databinding)
   {
      base.CreateChildControls();
      int count = 0;
      foreach (var item in datasource)
      {
          var tileButton = item as TileButton;
          tileButton.ID = "tile" + count;
          Controls.Add(tileButton);
          TileButtons.Add(tileButton);
          count++;
      }
      return count;
   }

   protected override void Render(HtmlTextWriter writer)
   {
      AddAttributesToRender(writer);

      writer.AddAttribute(HtmlTextWriterAttribute.Class, "some css classes");
      writer.RenderBeginTag(HtmlTextWriterTag.Div);

      foreach (var tile in TileButtons)
      {
         tile.CssClass = "button css classes";
         tile.RenderControl(writer);
      }

      writer.RenderEndTag();
   }
}

И на странице он включен так:

<Something:TilesControl runat="server" ID="tiles1" DataSourceID="source1"></Something:TilesControl>

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

Дополнительно: я бы хотел, чтобы у TileButton было свойство, определяющее, что делать при нажатии кнопки (какой-то тип делегата?).Есть какие-нибудь указатели на это?

Большое спасибо.

1 Ответ

0 голосов
/ 06 декабря 2018

Похоже, вы связываете List<TileButton> как источник данных TilesControl.Таким образом, вы можете привязать событие Click к одной из этих кнопок в списке, прежде чем связать их как источник данных.

protected void Page_Load(object sender, EventArgs e)
{
    //create a new tilescontrol instance
    TilesControl tc = new TilesControl();

    //create a list of tilebuttons
    List<TileButton> buttons = new List<TileButton>();

    //add some buttons for testing
    for (int i = 0; i < 10; i++)
    {
        TileButton b = new TileButton();

        b.ID = "TileButton" + i;
        b.Title = "TileButton " + i;

        //add the click event of a button here
        b.Click += TileButton_Click;

        //add the button to the list
        buttons.Add(b);
    }

    //bind the list of buttons to the tilescontrol
    tc.DataSource = buttons;
    tc.DataBind();

    //add the tilescontrol to the page
    PlaceHolder1.Controls.Add(tc);
}

private void TileButton_Click(object sender, EventArgs e)
{
    //display results
    Label1.Text = ((TileButton)sender).Title + " Clicked!";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...