这是Master-Detail表单.Master是一个GridView.而且,细节是一个DetailsView.
整个过程以编程方式实现.
从代码中可以看出,DetailsView使用Master-objects的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() { Listorders = 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(); } }
您是否考虑过使用DataKeyNames
gridview 的属性?这样您就可以从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; } }