我做的DataGrid是由SqlDataReader自动生成列的,然后需要再在后面添加几列,比如删除列之类的,请问应该如何实现?如果在设计时加好,这几列就会显示在最前面,而且我希望能够根据权限来决定是否要添加这些列,所以要动态添加。我试过在代码中一列一列地添加,但不知为什么不能显示。请各位大虾帮我出出主意!

解决方案 »

  1.   

    示例
    [Visual Basic, C#] 下面的示例展示如何使用 AddAt 方法动态向 DataGrid 控件添加列。注意,DataGrid 控件的 Columns 属性是 DataGridColumnCollection 的一个实例。[C#] 
    <%@ Page Language="C#" AutoEventWireup="True" %>
    <%@ Import Namespace="System.Data" %>
     
    <html>
       <script language="C#" runat="server">
     
          DataTable Cart;
          DataView CartView;
     
          ICollection CreateDataSource() 
          {
             DataTable dt = new DataTable();
             DataRow dr;
     
             dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
             dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
             dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
     
             for (int i = 0; i < 9; i++) 
             {
                dr = dt.NewRow();
       
                dr[0] = i;
                dr[1] = "Item " + i.ToString();
                dr[2] = 1.23 * (i + 1);
     
                dt.Rows.Add(dr);
             }
     
             DataView dv = new DataView(dt);
             return dv;
          } 
     
          void Page_Load(Object sender, EventArgs e) 
          {         if (Session["DG4_ShoppingCart"] == null) 
             {
                Cart = new DataTable();
                Cart.Columns.Add(new DataColumn("Item", typeof(string)));
                Cart.Columns.Add(new DataColumn("Price", typeof(string)));
                Session["DG4_ShoppingCart"] = Cart;
             }
             else 
             {
                Cart = (DataTable)Session["DG4_ShoppingCart"];
             }    
             CartView = new DataView(Cart);
             ShoppingCart.DataSource = CartView;
             ShoppingCart.DataBind();
     
             if (!IsPostBack) 
             {
                // Load this data only once.
                ItemsGrid.DataSource= CreateDataSource();
                ItemsGrid.DataBind();
             }      }      void Page_Init(Object sender, EventArgs e) 
          {         // Create a dynamic column to add to Columns collection.
             BoundColumn NumberColumn = new BoundColumn();
             NumberColumn.HeaderText="Item Number"; 
             NumberColumn.DataField="IntegerValue";         // Add column to Columns collection.
             ItemsGrid.Columns.AddAt(2, NumberColumn);      }
      
          void Grid_CartCommand(Object sender, DataGridCommandEventArgs e) {
         
             DataRow dr = Cart.NewRow();
              
             // e.Item is the table row where the command is raised.
             // For bound columns, the value is stored in the Text property of the TableCell.
             TableCell itemCell = e.Item.Cells[2];
             TableCell priceCell = e.Item.Cells[3];
             string item = itemCell.Text;
             string price = priceCell.Text;
             
             if (((Button)e.CommandSource).CommandName == "AddToCart") 
             {
                dr[0] = item;
                dr[1] = price;
                Cart.Rows.Add(dr);
             }
             else 
             {             //Remove from Cart.
             
                CartView.RowFilter = "Item='" + item + "'";
                if (CartView.Count > 0) 
                {    
                   CartView.Delete(0);
                }
                CartView.RowFilter = "";
             }
             ShoppingCart.DataBind();
     
          }
     
       </script>
     
    <body>
     
       <form runat=server>
     
          <h3>DataGridColumnCollection AddAt Example</h3>
     
          <table cellpadding="5">
             <tr valign="top">
                <td>
     
                   <b>Product List</b>
     
                   <asp:DataGrid id="ItemsGrid"
                        BorderColor="black"
                        BorderWidth="1"
                        CellPadding="3"
                        AutoGenerateColumns="false"
                        OnItemCommand="Grid_CartCommand"
                        runat="server">                  <HeaderStyle BackColor="#00aaaa">
                      </HeaderStyle>
     
                      <Columns>
     
                         <asp:ButtonColumn 
                              HeaderText="Add to cart" 
                              ButtonType="PushButton" 
                              Text="Add" 
                              CommandName="AddToCart"/>
     
                         <asp:ButtonColumn 
                              HeaderText="Remove from cart" 
                              ButtonType="PushButton" 
                              Text="Remove" 
                              CommandName="RemoveFromCart"/>
     
                         <asp:BoundColumn 
                              HeaderText="Item" 
                              DataField="StringValue"/>
     
                         <asp:BoundColumn 
                              HeaderText="Price" 
                              DataField="CurrencyValue" 
                              DataFormatString="{0:c}">                        <ItemStyle HorizontalAlign="right">
                            </ItemStyle>                     </asp:BoundColumn>
     
                      </Columns>
       
                   </asp:DataGrid>
     
                </td>
                <td>
     
                   <b>Shopping Cart</b>
     
                   <asp:DataGrid id="ShoppingCart" 
                        runat="server"
                        BorderColor="black"
                        BorderWidth="1"
                        GridLines="Both"
                        ShowFooter="false"
                        CellPadding="3"
                        CellSpacing="0">                  <HeaderStyle BackColor="#00aaaa">
                      </HeaderStyle>                </asp:DataGrid>
     
                </td>
             </tr>
     
          </table>
     
       </form>
     
    </body>
    </html>
      

  2.   

    建议先查 msdn 再提问。
      

  3.   

    上面的那个例子好像不是自动生成列的DataGrid,而且涉及到DataTable、DataView,能不能不用到这些东东,DataGrid要用自动生成列的行不行?
      

  4.   

    偶感觉不行,AutoGenerateColumns="False"设置为非自动生成列后才可以的.自动生成列好象用的不多把.参考偶的.<asp:datagrid id="DgManage" runat="server" AllowPaging="True" AutoGenerateColumns="False" Width="100%"
    DataKeyField="ID">
    <Columns>
    <asp:TemplateColumn HeaderText="选择">
    <ItemTemplate>
    <asp:CheckBox ID="CbxSel" Runat="server"></asp:CheckBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn Visible="False" DataField="id"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="标题">
    <ItemTemplate>
    <table>
    <tr runat="server" id="trid">
    <td>
    <asp:HyperLink ID ="HlkEdit" Runat ="server" NavigateUrl='<% # MakeUrl(DataBinder.Eval(Container.DataItem,"id"))%>' Text ='<% # DataBinder.Eval(Container.DataItem,"subject")%>'>
    </asp:HyperLink></td>
    </tr>
    </table>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="删除">
    <ItemTemplate>
    <asp:LinkButton ID="lbtnDel" Runat="server" text="删除" CommandName="Delete"></asp:LinkButton>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    <PagerStyle Mode="NumericPages"></PagerStyle>
    </asp:datagrid>
      

  5.   

    动态添加删除列的问题已经搞定,不过因为设置了AutoGenerateColumns为true,好像DataGrid的排序就无法实现了,即使设了AllowSorting=true,还是无法点击列头(没有链接)做排序,这又是为什么呀?