繁体   English   中英

无法遍历gridview列(自动生成)?

[英]Unable to traverse the gridview columns (Auto Generated)?

我正在尝试使用以下代码遍历ASP.net Web应用程序中的gridview列,但是该代码不在foreach循环内。

// Code snippet to hide columns from a gridview named 'gvEmployees'
gvEmployees.DataSource = dvItems.ToTable();
gvEmployees.DataBind();
string name = "First Name"; //Column name supposed to hide
int index=-1;

foreach (DataColumn col in gvEmployees.Columns)
{
   if (col.ColumnName.ToLower().Trim() == name.ToLower().Trim())
   {
      // Getting the column index if find a match
      index= gvEmployees.Columns.IndexOf(col); 
      // Using the above index, hiding the column from the grid view.
      gvEmployees.Columns[index].Visible = false;
   }

}

我试图从gridview隐藏一些列。

将这些代码移至其他事件,例如rowInitialize或PreRender或GridInitialize

string name = "First Name";// Column name supposed to hide
int index=-1;
foreach (DataColumn col in gvEmployees.Columns)
{
 if (col.ColumnName.ToLower().Trim() == name.ToLower().Trim())
 {
  col.Visible = false;
 }

}

我想我可能会发现问题所在。 您不应将DataColumn用作枚举变量的数据类型。 尝试这个:

        string name = "First Name";// Column name supposed to hide
        for (int i = 0; i < gvEmployees.Columns.Count; i++)
        {
            if (gvEmployees.Columns[i].HeaderText.ToLower().Trim() == name.ToLower().Trim())
            {
                gvEmployees.Columns[i].Visible = false;
            }

        }

我认为您正在尝试根据列标题隐藏列,因此请尝试以下代码,

// Code snippet to hide columns from a gridview named 'gvEmployees'
gvEmployees.DataSource = dvItems.ToTable();
gvEmployees.DataBind();
string name = "First Name";// Column name supposed to hide
foreach (var col in gvEmployees.Columns)
{
  if (col.Text.ToLower().Trim() == name.ToLower().Trim())
  {
      // hiding the column from the grid view.
      col.Visible = false;
  }
}

更新

您还可以编写以下代码:

string name = "First Name";// Column name supposed to hide
for (int i = 0; i < gvEmployees.Columns.Count; i++)
{
    if (gvEmployees.Columns[i].Text.ToLower().Trim() == name.ToLower().Trim())
    {
        gvEmployees.Columns[i].Visible = false;
    }
}

使用自动生成的列时更新(对于单列版本),

当绑定行时,您需要使用rowdatabound事件并隐藏单元格(列)。

int index = 0;
bool hidden = false;
protected void gvEmployees_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if(hidden)
    {
         e.Row.Cells[index].Visible =  false;
         return;
    }

    string name = "First Name";// Column name supposed to hide
    for (int i = 0; i < e.Row.Cells.Count; i++)
    {
        if (e.Row.Cells[i].Text.ToLower().Trim() == name.ToLower().Trim())
        {
            e.Row.Cells[i].Visible = false;
            hidden = true;
            index = i;
            break;
        }
    }
}

使用自动生成的列时更新(对于多列版本)

使用rowdatabound事件并在绑定行时隐藏单元格(列)。

List<int> indexes = new List<int>();
bool hidden = false;
List<string> names = new List<string>();
protected void gvEmployees_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if(hidden)
    {
         foreach(int index in indexes)
         {
             e.Row.Cells[index].Visible =  false;
         }
    }

    // start - Column names supposed to hide
    // Building the list of column names to be hidden.
    names.Add("First Name");
    names.Add("Last Name");
    names.Add("Address");
    names.Add("ID");
    // end - Column names supposed to hide

    for (int i = 0; i < e.Row.Cells.Count; i++)
    {
        if (names.Contains(e.Row.Cells[i].Text.ToLower().Trim())
        {
            e.Row.Cells[i].Visible = false;
            hidden = true;
            indexes.Add(i);
        }
    }
}

您的问题是列是自动生成的(gvEmployees.AutoGenerateColumns == true)。 自动生成的列不在 “列”集合中。

如果您想对列进行这种控制,我认为您将需要在设计时生成它们。 您可以在表单上使用任何类型的DataSource对象,然后将其连接到GridView吗? 这将在设计器文件中生成与数据匹配的列,而不是依靠AutoGenerateColumns在DataBind()上创建列。 然后,这些列将在Columns集合中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM