2012-05-08 3 views
0

У меня есть веб-приложение C# aspx, предназначенное для генерации большинства его компонентов на лету. Этот GridView предназначен для отображения некоторых флажков.Динамический флажок на gridview

Более сложная вещь заключается в том, что она не отображает компонент при запуске, а пространство имен, то есть System.UI.Webcontrols.CheckBox.

Мне нужно установить флажок; как это можно исправить?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" /> 
    </div> 
    </form> 
</body> 
</html> 

[aspx.cs] 

namespace ChkBoxOnGridView 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      PopulateGridView(); 
     } 
     protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       CheckBox cb = new CheckBox(); 
       e.Row.Cells[1].Controls.Add(cb); 
      } 
     } 

     private void PopulateGridView() 
     { 
      GridView1.DataSource = null; 
      GridView1.Columns.Clear(); 

      DataTable dt = new DataTable(); 

      dt.Columns.Add(new DataColumn("DTA", typeof(System.String))); 
      dt.Columns.Add(new DataColumn("Is Visible", typeof(System.Web.UI.WebControls.CheckBox))); 

      CheckBox chkbx = new CheckBox(); 
      chkbx.Checked = true; 

      DataRow row1 = dt.NewRow(); 
      row1["DTA"] = "Some Text"; 
      row1["Is Visible"] = chkbx; 
      dt.Rows.Add(row1); 

      foreach (DataColumn col in dt.Columns) 
      { 
       BoundField bField = new BoundField(); 
       bField.DataField = col.ColumnName; 
       bField.HeaderText = col.ColumnName; 
       GridView1.Columns.Add(bField); 
      } 

      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 
    } 
} 

ответ

2

Вам нужно создать каждый объект по отдельности в каждой строке, используя GridView.RowdataBound event.

Вы можете добавить его с помощью e.Row.Cells[]

Но, чтобы убедиться, что вы создаете ее в нужном месте, вы должны проверить в этом случае, если вы находитесь в строке, которая не является заголовок или нижний колонтитул или пейджер. Вы можете сделать это путем проверки GridViewRow.RowType Property в e.Row и проверить, если это DataRow

void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
{ 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
    CheckBox cb = new CheckBox(); 
    // cb.id = ... and other control setup 
    // add your control here: 
    e.Row.Cells[0].Controls.Add(cb); 
    } 
} 
+0

Не могли бы вы показать мне рабочую модель, основанную на моем коде, совершенно новую для C#. – antowizzy

+0

Нет ничего сложного в том, что я вам показываю. Однако я поясню, что вам просто нужно DataBind вашего CustomerGridView и обрабатывать его событие RowDataBound с помощью кода, подобного показанному. Вы можете получить доступ к данным, связанным с каждым приведением строк e.Row.DataItem к вашему классу модели, чтобы вы могли легко получить доступ к своим свойствам, чтобы решить, как добавить свой контроль. – JotaBe

+0

Как мне сделать cb, чтобы взять проверенное состояние chkbx, а также удалить третий столбец, который является повторением первого столбца? Я обновил код. – antowizzy

1

Выходя на конечности, я бы сказал, что вы не можете держать контроль в DataTable. [Is Visible] должен быть логическим значением

Я бы добавил столбцы в событие On Init, используя столбец шаблона. См. Этот вопрос: Adding dynamic columns to an ASP.NET Gridview

Смежные вопросы