1

我创建了一个复合控件,其中包含许多图块(也是自定义控件)。在我的网页中,我想捕捉磁贴的点击事件,但我不知道如何。

这是 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 有一个属性,该属性定义单击按钮时要做什么(某种类型的委托?)。对此有任何指示吗?

非常感谢。

4

1 回答 1

0

看起来您正在将 a 绑定List<TileButton>为 的 DataSource TilesControl。因此,您可以先将 Click 事件绑定到 List 中的这些按钮之一,然后再将它们绑定为 DataSource。

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!";
}
于 2018-12-06T14:31:32.530 回答