Adding an ellipsis overflow to a table cell in an ASP.Net GridView.

When using percentage widths.

I ran into an issue of having the name field of a cell in a GridView too long, causing the whole table to mess up my CSS widths.

Now you can't just add this CSS to the desired table cell when using a percentage width:

overflow: hidden;
text-overflow: ellipsis;

The workaround I used for this is to create a div inside the table cell and use the css class for that div to determine it's width using the @media rule. Here are my examples:

WebPage.aspx

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="TestName" HeaderText="Test name">
        <asp:BoundField DataField="TestDesc" HeaderText="Test description">
    </Columns>
</asp:GridView>

WebPage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    List<Person> people = GetPeople();

    DataTable dtPeople = new DataTable();
    dtPeople.Columns.Add("TestName");
    dtPeople.Columns.Add("TestDesc");

    foreach (Person person in people)
    {
        DataRow drPerson = dtPeople.NewRow();
        drPerson["TestName"] = $"<div class='name-overflow'>{person.Name}</div>";
        drPerson["TestDesc"] = person.Description;

        dtPeople.Rows.Add(drPerson);
    }

    GridView1.DataSource = dtPeople;
    GridView1.DataBind();
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    /* Set the width to a percentage. */
    e.Row.Cells[0].Width = new Unit("50%");
    /* Properly display the div. */
    e.Row.Cells[0].Text = Server.HtmlDecode(e.Row.Cells[0].Text);
}

WebSite.css

@media (max-width: 1000px) {
    .name-overflow {
        width: 300px;
    }
}

@media (max-width: 900px) {
    .name-overflow {
        width: 260px;
    }
}

/* Continue decreasing the max-width and width to get the desired effect. */

.name-overflow {
    overflow: hidden;
    text-overflow: ellipsis;
}

The @media tag changes the value of the width of .name-overflow based on the width of the current screen. See more here w3schools.com/cssref/css3_pr_mediaquery.asp