c#

时间:2017-03-23 07:19:17

标签: c# asp.net gridview

我有一个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 '&nbsp;' 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时,我的最终输出应如下所示:

Flipped Gridview

2 个答案:

答案 0 :(得分:0)

列标题文本和列名称不同,哪个列名在DataTable中必须是唯一的。

因此,对于您的实例,您可以为没有列标题文本的列指定不同的随机名称

而且,你需要检测Header是否是真正的string.Empty或者看起来像空的东西,在你的情况下,标题文本永远不是空值,它是&nbsp;

所以你的逻辑永远不会命中,我的意思是cell.Text==""将永远返回false

所以这是解决方案

foreach (TableCell cell in GridView6.HeaderRow.Cells)
{
    if (cell.Text == "&nbsp;")
    {
        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);
    }
}