2009-11-30 47 views
1

这是一个主 - 明细表格。 Master是一个GridView。而Detail则是一个DetailsView。asp.net使gridView列隐形

整个事情是通过编程实现的。

从代码中可以看到,DetailsView使用主对象的ID来检索Detail项。

我需要使Master-GridView的ID列不可见。因为这对页面的用户来说是无足轻重的。但它不能损害页面逻辑。

但代码行GridView1.Columns[1].Visible = false;正在生成异常。

Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

我该如何解决这个问题?

public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       BindData(); 
      } 
     } 

     protected void BindData() 
     { 
      List<Order> orders = Order.Get(); 

      GridView1.DataSource = orders; 
      GridView1.DataBind(); 

      // This is giving Error...............!!! 
      GridView1.Columns[1].Visible = false; 

      // At first, when the page first loads, 
      //  GridView1.SelectedIndex == -1 
      // So, this is done to automatically select the 1st item. 
      if (GridView1.SelectedIndex < 0) 
      { 
       GridView1.SelectedIndex = 0; 
      } 

      int selRowIndex = GridView1.SelectedIndex; 

      int selMasterId = Convert.ToInt32(GridView1.Rows[selRowIndex].Cells[1].Text); 

      Order master = Order.Get(selMasterId); 

      labItemsCount.Text = master.Items.Count.ToString(); 

      DetailsView1.DataSource = master.Items; 
      DetailsView1.DataBind();    
     } 

     protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      BindData(); 
     } 

     protected void DetailsView1_PageIndexChanging(object sender, DetailsViewPageEventArgs e) 
     { 
      DetailsView1.PageIndex = e.NewPageIndex; 

      BindData(); 
     } 
    } 

alt text

+0

什么是错误? – Phaedrus 2009-11-30 17:49:02

回答

7

你有没有使用的GridView的DataKeyNames性能考虑?这样,您可以从GridView bu删除'id'列,但仍然可以访问Page_Load中的'id'值。

DataKeyNames = "id" 

然后你可以像这样得到id的值。

int selRowIndex = GridView1.SelectedIndex; 
int selMasterId = Convert.ToInt32(GridView.DataKeys[selRowIndex].Value); 
Order master = Order.Get(selMasterId); 

或者,你可以尝试改变在OnRowBound事件GridView的列的可见性。

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Header || 
     e.Row.RowType == DataControlRowType.DataRow || 
     e.Row.RowType == DataControlRowType.Footer) 
    { 
     e.Row.Cells[1].Visible = false; 
    } 
} 
+0

你有AutoGenerateColumns =“true”吗? – Phaedrus 2009-11-30 18:01:43

+0

是的,我已经设置为true。 – anonymous 2009-11-30 18:05:42

+4

使用AutoGenerateColumns =“true”时,不会填充GridView的列集合,这就是您收到索引超出范围异常的原因。 – Phaedrus 2009-11-30 18:11:02