ContentPlaceHolder ‘a çalışma zamanında dinamik UserControl eklemek

Bazen farklı kontrolleri Asp.Net sayfalarımıza çalışma zamanında ekleme ihtiyacı duyabiliriz. her sayfa için ayrı ayrı ugrasmak yerine bunları hazırlamıs oldugumuz yönetim panelinden görünür yapmak veya belirli sorgularla sayfalara ekleme ihtiyacımız olabilir.  Bu konumuz Master Page kullandıgımız bir web sayfasında tasarım aşamasında hazırlamış olduğumuz ContentPlaceHolder lara kontrolleri dinamik olarak eklemek olacak.

Öncelikle bir Asp.Net Web Site Projesi açıyoruz. Projemize 1 adet master page ekliyoruz ve isimleri cpLeft,cpRight isimli 2 adet ContentPlaceHolder ekliyoruz.

<form id="form1" runat="server">
    <div style="width: 805px; margin: 0 auto;">
        <div style="float: left; width: 200px;">
            <asp:ContentPlaceHolder ID="cpLeft" runat="server">
            </asp:ContentPlaceHolder>
        </div>
        <div style="float: right; width: 600px;">
            <asp:ContentPlaceHolder ID="cpRight" runat="server">
            </asp:ContentPlaceHolder>
        </div>
    </div>
    </form>

 

Web Kontrollerimizin listesini tutacağımız ControlList adında bir class oluşturuyoruz. Bu class yerine Veritabanı, XML gibi kaynaklarda kullanabilirsiniz.

public class ControlList
    {
        public string ControlPath;
        public string PanelAdi;

        public ControlList(string _controlpath,string _paneladi)
        {
            this.ControlPath = _controlpath;
            this.PanelAdi = _paneladi;
        }
    }

List<ControlList> listesine 2 adet oluşturduğumuz User Control ‘ü ekliyoruz.

Hazırladığımız liste içerisinde foreach ile dönüyoruz. Virtual Path i Server.MapPath fonksiyonu ile statik path e çeviriyoruz ve System.IO kütüphanesini kullanarak dosyanın mevcut olup olmadığını kontrol ediyoruz dosya mevcut ise User Control’ü tmpUserControl isimli değişkene atıyoruz.

FindControl metodu ile ContentPlaceHolder ‘ı Master Page içerisinde aratıyoruz. Aynı isimli farklı bir kontrol olma ihtimaline karşı bulunan Control’ün ContentPlaceHolder olup olmadığını kontrol ediyoruz. Şayet Bulduğumuz Control ContentPlaceHolder ise User Control’ü ContentPlaceHolder içerisine ekliyoruz.

        protected void Page_Load(object sender, EventArgs e)
        {
            List<ControlList> tmpControlListesi = new List<ControlList>();
            tmpControlListesi.Add(new ControlList("/menu.ascx", "cpLeft"));
            tmpControlListesi.Add(new ControlList("/detay.ascx", "cpRight"));

            foreach (var cl in tmpControlListesi)
            {
                string controlpath = Server.MapPath(cl.ControlPath);

                if (File.Exists(controlpath))
                {
                    UserControl tmpUserControl = (UserControl)this.LoadControl(cl.ControlPath);

                    Control cpFind = (Control)this.Page.Master.FindControl(cl.PanelAdi);

                    if (cpFind is ContentPlaceHolder)
                    {
                        cpFind.Controls.Add(tmpUserControl);
                    }
                }
            }
        }

Örnek Projeyi İndir

Dosya Adı : DinamikContentPlaceHolder

Bir cevap yazın