2013-08-17 3 views
1

Я новичок в Asp.net и оглянулся, чтобы узнать, как это сделать, но не смог найти его.Create DetailsView from codebehind

Я хотел бы создать подробный обзор целиком из кода. Это связано с тем, что мне нужны определенные поля для загрузки на основе разрешений пользователя. Кроме того, я хотел бы, чтобы возможность редактировать представление сведений была доступна только определенным пользователям. Есть ли способ сделать это?

+0

Вы используете Webforms или MVC? Если вы не используете MVC, запустите. –

+0

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

+0

@ Daniel Mann Я использую webforms. Я подумал, что это лучше всего, так как я все еще учусь, прежде чем перейти на MVC. Это неправильно? Является ли MVC лучше этого типа? – Cineno28

ответ

2

Это очень простая реализация DetailsView программно. Это поможет вам начать.

protected void Page_Load(object sender, EventArgs e) 
    { 
     DetailsView dv = new DetailsView(); 
     dv.ID = "MyDv"; 
     dv.DataSource = GetDataSet(); // returns a dataset filled using Select Query 

     TemplateField tf = new TemplateField(); 
     tf.ItemTemplate = new AddTemplateToDetailsView(ListItemType.Item); 

     dv.Fields.Add(tf); 

     dv.DataBind(); 
     placeholder1.Controls.Add(dv); 

    } 

Код файла класса для добавления TemlplateField. <asp:TemplateField>

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Web.UI; 
using System.Data; 

public class AddTemplateToDetailsView : ITemplate 
{ 
    private ListItemType _ListItemType; 

    public AddTemplateToDetailsView(ListItemType listItemType) 
    { 
     _ListItemType = listItemType; 
    } 
    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     if (_ListItemType == ListItemType.Item) 
     { 
      Label lblID = new Label(); 
      lblID.DataBinding += new EventHandler(lblID_DataBinding); 
      container.Controls.Add(lblID);  
     }  
    }  
    void lblID_DataBinding(object sender, EventArgs e) 
    {  
     Label lblID = (Label)sender; 
     DetailsView container = (DetailsView)lblID.NamingContainer; 
     lblID.Text = ((DataRowView)container.DataItem)["CustomerID"].ToString(); 
    } 

} 

В случае, если вы также должны добавить InsertItemTemplate ИЛИ EditItemTemplate, Вы можете создать UserControls для того же и добавить те, в Page_Init(), как показано ниже. UserControl должен наследовать ITemplate.

protected void Page_Init(object sender, EventArgs e) 
{ 
this.DetailsView1.EditItemTemplate = Page.LoadTemplate("UserControlEdit.ascx"); 
this.DetailsView1.InsertItemTemplate = Page.LoadTemplate("UserControlInsert.ascx"); 
} 

Прочитано MSDN here.

+0

Спасибо за помощь. Кажется, это то, что мне нужно. – Cineno28

0

Заполнить R.C. Ответ: В методе Databinding, если источник данных не DataRowView, вы можете использовать:

lblID.Text = DataBinder.Eval(dv.DataItem,"CustomerID").ToString(); 

Это работает для меня. Я нашел это несколько раз на этом форуме.