2017-02-12 79 views
0

我有一个GridView,其中有10列。10我有5列命名为Ata,Hplan,Hosp,其他(这4个是checkboxfield),其他颜色(Boundfield),再次Alta,Hplan等..现在我想要在用户下拉选择要么5列添加或所有10 ..我需要禁用gridview视图状态?我怎么能实现这一点和第二个问题是我怎么能动态连续数据绑定event.Basic东西时绑定这些列的是,我希望gridview的列名来复制,但是在数据表中我不能给重复列names.please帮助..从asp.net动态数据表中动态绑定gridview列

protected void Btnshow_Click(object sender, EventArgs e) 
     { 
      if (DropDownList1.SelectedIndex==1) 
      { 
       dtgridbind.Columns.AddRange(new DataColumn[10] { new DataColumn("1_ALta", typeof(bool)),new DataColumn("1_Hplan", typeof(bool)), 
          new DataColumn("1_Hosp",typeof(bool)),new DataColumn("1_other",typeof(bool)),new DataColumn("1_othercolor",typeof(string)), 
          new DataColumn("2_ALta", typeof(bool)),new DataColumn("2_Hplan", typeof(bool)), 
          new DataColumn("2_Hosp",typeof(bool)),new DataColumn("2_other",typeof(bool)),new DataColumn("2_othercolor",typeof(string))}); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       GridView1.DataSource = dtgridbind; 
       GridView1.DataBind(); 
       // ViewState["modechange"] = 1; 
      } 
      else 
      { 
       dtgridbind.Columns.AddRange(new DataColumn[5] { new DataColumn("1_ALta", typeof(bool)),new DataColumn("1_Hplan", typeof(bool)), 
          new DataColumn("1_Hosp",typeof(bool)),new DataColumn("1_other",typeof(bool)),new DataColumn("1_othercolor",typeof(string))}); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A"); 
       dtgridbind.Rows.Add(true, false, false, false, "Red"); 
       // ViewState["grid"] = dtgridbind; 
       GridView1.DataSource = dtgridbind; 
       GridView1.DataBind(); 
      } 
     } 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.Header) 
      { 

       foreach (DataColumn datacol in dtgridbind.Columns) 
       { 
        if (datacol.ColumnName.Contains("_othercolor")) 
        { 
         BoundField bfield = new BoundField(); 
         bfield.HeaderText = datacol.ColumnName.Substring(2, datacol.ColumnName.Length - 2); 
         bfield.DataField = datacol.ColumnName; 
         GridView1.Columns.Add(bfield); 
        } 

        else 
        { 
         CheckBoxField ck = new CheckBoxField(); 
         ck.HeaderText = datacol.ColumnName.Substring(2, datacol.ColumnName.Length - 2); 
         ck.DataField = datacol.ColumnName; 
         GridView1.Columns.Add(ck); 





        } 
       } 
      } 

回答

0

这段代码做什么你要?在这个代码中,有一个包含两个值的下拉列表。如果选择“10列”,则回发并将10列添加到数据表。如果选择“5列”,则回发并将5列添加到数据表。

在OnRowDataBound中,它循环遍历标题单元格,并根据“_”字符分割文本。然后它接受第二部分。如果您按照列的命名约定,这将仅适用。

您不能使用具有相同列名称的数据列。为了解决这个问题,你可以使用OnRowDataBound,并按上面所述修改单元格文本。结果

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="true"> 
      <asp:ListItem Text="" Value =""></asp:ListItem> 
      <asp:ListItem Text="10 Columns" Value ="1"></asp:ListItem> 
      <asp:ListItem Text="5 Columns" Value ="2"></asp:ListItem> 
     </asp:DropDownList> 
     <asp:GridView runat="server" ID="GridView1" OnRowDataBound="GridView1_RowDataBound"></asp:GridView> 
    </form> 
</body> 
</html> 


public partial class WebForm3 : System.Web.UI.Page 
    { 
     private DataTable dtgridbind = new DataTable(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.Header) 
      { 
       foreach (TableCell headerCell in e.Row.Cells) 
       { 
        headerCell.Text = headerCell.Text.Split('_')[1]; 
       } 
      } 
     } 

     protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (DropDownList1.SelectedIndex == 1) 
      { 
       dtgridbind.Columns.AddRange(new DataColumn[10] { new DataColumn("1_ALta", typeof(bool)),new DataColumn("1_Hplan", typeof(bool)), 
          new DataColumn("1_Hosp",typeof(bool)),new DataColumn("1_other",typeof(bool)),new DataColumn("1_othercolor",typeof(string)), 
          new DataColumn("2_ALta", typeof(bool)),new DataColumn("2_Hplan", typeof(bool)), 
          new DataColumn("2_Hosp",typeof(bool)),new DataColumn("2_other",typeof(bool)),new DataColumn("2_othercolor",typeof(string))}); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A", false, true, false, false, "Red"); 
       GridView1.DataSource = dtgridbind; 
       GridView1.DataBind(); 
      } 
      else 
      { 
       dtgridbind.Columns.AddRange(new DataColumn[5] { new DataColumn("1_ALta", typeof(bool)),new DataColumn("1_Hplan", typeof(bool)), 
          new DataColumn("1_Hosp",typeof(bool)),new DataColumn("1_other",typeof(bool)),new DataColumn("1_othercolor",typeof(string))}); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A"); 
       dtgridbind.Rows.Add(true, false, false, false, "N/A"); 
       dtgridbind.Rows.Add(true, false, false, false, "Red"); 
       GridView1.DataSource = dtgridbind; 
       GridView1.DataBind(); 
      } 
     } 
    } 

截图: enter image description here

+0

heyyy ..thanks buddy..but荫没有得到内部headercell.text.I任何文本还没有gridview.I静态定义列真不知道是什么原因这是发生..有人知道? –

+0

我在帖子的底部添加了结果的屏幕截图。这与你得到的结果相符吗?数据表绑定到gridview,因此列名将是headercell文本。当我调试代码时,headercell.text填充了数据表列名称。 –