asp.net使gridView列不可见
这是一个主-明细表。Master是一个GridView。而且,细节是一个细节视图 整个过程都是通过编程实现的 从代码中可以看到,DetailsView使用主对象的ID来检索细节项 我需要使主GridView的ID列不可见。因为,这对于页面的用户来说是无关紧要的。但它不能损害页面逻辑 但是代码行,asp.net使gridView列不可见,asp.net,gridview,Asp.net,Gridview,这是一个主-明细表。Master是一个GridView。而且,细节是一个细节视图 整个过程都是通过编程实现的 从代码中可以看到,DetailsView使用主对象的ID来检索细节项 我需要使主GridView的ID列不可见。因为,这对于页面的用户来说是无关紧要的。但它不能损害页面逻辑 但是代码行,GridView1.Columns[1].Visible=false正在生成异常 Index was out of range. Must be non-negative and less than th
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();
}
}
public分部类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
BindData();
}
}
受保护的void BindData()
{
List orders=Order.Get();
GridView1.DataSource=订单;
GridView1.DataBind();
//这是一个错误。。。。。。。。。。。。。。。!!!
GridView1.Columns[1]。Visible=false;
//首先,当页面第一次加载时,
//GridView1.SelectedIndex==-1
//因此,这样做是为了自动选择第一个项目。
如果(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);
labitemscont.Text=master.Items.Count.ToString();
DetailsView1.DataSource=master.Items;
DetailsView1.DataBind();
}
受保护的void GridView1\u SelectedIndexChanged(对象发送方,事件参数e)
{
BindData();
}
受保护的void DetailsView1_PageIndexChanging(对象发送方,DetailsViewPageEventArgs e)
{
DetailsView1.PageIndex=e.NewPageIndex;
BindData();
}
}
您是否考虑过使用gridview的DataKeyNames
属性?通过这种方式,您可以从GridView
bu中删除'id'列,但仍可以访问页面加载中的'id'值
DataKeyNames = "id"
然后你可以像这样得到id的值
int selRowIndex = GridView1.SelectedIndex;
int selMasterId = Convert.ToInt32(GridView.DataKeys[selRowIndex].Value);
Order master = Order.Get(selMasterId);
或者,您可以尝试在GridView
的OnRowBound
事件中更改列的可见性
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;
}
}
您是否考虑过使用gridview的DataKeyNames
属性?通过这种方式,您可以从GridView
bu中删除'id'列,但仍可以访问页面加载中的'id'值
DataKeyNames = "id"
然后你可以像这样得到id的值
int selRowIndex = GridView1.SelectedIndex;
int selMasterId = Convert.ToInt32(GridView.DataKeys[selRowIndex].Value);
Order master = Order.Get(selMasterId);
或者,您可以尝试在GridView
的OnRowBound
事件中更改列的可见性
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;
}
}
您是否有AutoGenerateColumns=“true”?使用AutoGenerateColumns=“true”时,GridView的columns集合未填充,这就是您收到索引超出范围异常的原因。您是否有AutoGenerateColumns=“true”?使用AutoGenerateColumns=“true”时,GridView的columns集合未填充,这就是您收到索引超出范围异常的原因。