asp.net使gridView列不可见

时间:2009-11-30 17:39:51

标签: asp.net gridview

这是Master-Detail表格。 Master是一个GridView。而且,细节是一个DetailsView。

整个过程以编程方式实现。

从代码中可以看出,DetailsView正在使用主对象的ID来检索详细信息项。

我需要使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

1 个答案:

答案 0 :(得分:7)

您是否考虑过使用gridview的DataKeyNames属性?这样您就可以从GridView中移除“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的{​​{1}}事件中列的可见性。

GridView