<br/> 指定換行位置 (如「課程名<br/>教室<br/>老師」)。GridView 預設 word-wrap: break-word 已開啟自動換行。若**不想**自動換行 (保持單行、超出隱藏或橫向捲動):
// 後端註冊樣式
GridView1.Attributes.Add("style", "word-break:keep-all; word-wrap:normal; white-space:nowrap;");
// 或 CSS 類別
.gv-nowrap { word-break: keep-all; word-wrap: normal; white-space: nowrap; }
<asp:GridView CssClass="gv-nowrap" ...>
屬性說明:
word-break:keep-all 中日韓文字不斷詞;
word-wrap:normal 單字過長不強制斷行;
white-space:nowrap 強制單行顯示。
GridView **預設開啟 HtmlEncode** (將 < 轉為 <),導致 <br/> 以純文字顯示而不換行。
<asp:TemplateField HeaderText="課程資訊">
<ItemTemplate>
<%# Eval("CourseInfo") %> <!-- 已包含 <br/> -->
</ItemTemplate>
</asp:TemplateField>
或 BoundField 設定:
<asp:BoundField DataField="CourseInfo" HtmlEncode="false" />
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
foreach (TableCell cell in e.Row.Cells)
{
// 將整列所有 HtmlEncode 內容還原
cell.Text = Server.HtmlDecode(cell.Text);
}
}
}
※ 僅需特定欄位解碼時,在迴圈中判斷 cell.ContainingField 或索引。
// 資料準備
var dt = new DataTable();
dt.Columns.Add("Info");
dt.Rows.Add("第一行<br/>第二行<br/>第三行");
dt.Rows.Add("無換行內容");
GridView1.DataSource = dt;
GridView1.DataBind();
// 方案:RowDataBound HtmlDecode
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
foreach (TableCell c in e.Row.Cells) c.Text = Server.HtmlDecode(c.Text);
}
結果:第一列顯示三行,第二列單行。
\r\n 或 Environment.NewLine → **HTML 忽略換行符**,必須用 <br/>。HtmlEncode="false" 卻未在資料中放入 <br/> → 不會換行。white-space:pre-wrap 與 HtmlEncode=false → 可直接用 \n 但需注意 XSS 風險。關閉 HtmlEncode 等同允許 HTML 標籤輸出,**資料來源必須受信** (後台管理、系統產生)。若資料來自使用者輸入,**必須先 Sanitize (如 HtmlSanitizer 庫) 再關閉 HtmlEncode**,否則極易造成 XSS。
GridView 換行核心口訣:
**自動換行** → CSS word-wrap/word-break/white-space;
**強制換行** → 資料含 <br/> + **關閉 HtmlEncode** (TemplateField 或 RowDataBound)。
記住安全第一:不可信資料**永不**關閉 HtmlEncode。