我有一个gridview,其中我不想显示两列的标题文本,两列应该具有相同的标题名称(INFA)。 Gridview看起来像:
<asp:GridView ID="GridView6" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="DayOfWeek" HeaderText="" ItemStyle-Width="30" />
<asp:BoundField DataField="DateOfMonth" HeaderText="" ItemStyle-Width="30" />
<asp:BoundField DataField="Emp_Name" HeaderText="INFA" ItemStyle-Width="30" />
<asp:BoundField DataField="Group_Name" HeaderText="INFA" ItemStyle-Width="30" />
<asp:BoundField DataField="Emp_Id" HeaderText="Mainframe" ItemStyle-Width="30" />
</Columns>
</asp:GridView>
我需要翻转此gridview并将行和列和列分成行。当我在所有DataFields的Header Text中有不同的名称时,逻辑工作正常。但根据我的要求,我不需要两列的标题文本,两列必须具有相同的标题文本(如Gridview中所示)。当我运行没有列名的逻辑时,如上所示,我收到此错误:
Exception Details: System.Data.DuplicateNameException: A column named ' ' already belongs to this DataTable.
我的逻辑是:
protected void btnConvert_Data()
{
System.Data.DataTable dt = new System.Data.DataTable("GridView_Data");
foreach (TableCell cell in GridView6.HeaderRow.Cells)
{
if (cell.Text == "")
{
dt.Columns.Add("");
}
else
{
dt.Columns.Add(cell.Text);
}
}
dt.Rows.Add("IST Hours");
//dt.Rows.Add("8:45AM-6PM");
foreach (GridViewRow row in GridView6.Rows)
{
dt.Rows.Add();
for (int i = 0; i < row.Cells.Count; i++)
{
dt.Rows[dt.Rows.Count - 1][i] = row.Cells[i].Text;
}
}
gvColumnsAsRows.DataSource = FlipDataTable(dt);
gvColumnsAsRows.DataBind();
gvColumnsAsRows.HeaderRow.Visible = false;
}
将行翻转成列,反之亦然:
public static System.Data.DataTable FlipDataTable(System.Data.DataTable dt)
{
System.Data.DataTable table = new System.Data.DataTable();
//Get all the rows and change into columns
for (int i = 0; i <= dt.Rows.Count; i++)
{
table.Columns.Add(Convert.ToString(i));
}
DataRow dr;
//get all the columns and make it as rows
for (int j = 0; j < dt.Columns.Count; j++)
{
dr = table.NewRow();
dr[0] = dt.Columns[j].ToString();
for (int k = 1; k <= dt.Rows.Count; k++)
dr[k] = dt.Rows[k - 1][j];
table.Rows.Add(dr);
}
return table;
}
我在 dt.Columns.Add(cell.Text); 行 btnConvert_Data()中收到上述错误。有人可以帮我解决这个问题吗?
当我翻转Gridview时,我的最终输出应如下所示:
答案 0 :(得分:0)
列标题文本和列名称不同,哪个列名在DataTable中必须是唯一的。
因此,对于您的实例,您可以为没有列标题文本的列指定不同的随机名称
而且,你需要检测Header是否是真正的string.Empty或者看起来像空的东西,在你的情况下,标题文本永远不是空值,它是
所以你的逻辑永远不会命中,我的意思是cell.Text==""
将永远返回false
所以这是解决方案
foreach (TableCell cell in GridView6.HeaderRow.Cells)
{
if (cell.Text == " ")
{
dt.Columns.Add(Guid.NewGuid().ToString()); //just some random value, i use guid, you can use anything you like to keep it unique.
}
else
{
dt.Columns.Add(cell.Text);
}
}
答案 1 :(得分:0)
您需要确保每列都有唯一的名称。您可以通过检查列名是否存在来实现,如果是,则通过将索引添加到列名称使其成为唯一列。
for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++)
{
string cellText = GridView1.HeaderRow.Cells[i].Text;
//check if the column name exists and if so make it unique
if (dt.Columns.Contains(cellText))
{
dt.Columns.Add(cellText + "_" + i);
}
else
{
dt.Columns.Add(cellText);
}
}