首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET DataGrid 與 Repeater 控制項資料綁定時轉換代碼值的多種寫法

     編輯:ASP.NET 基礎

資料庫常儲存代碼值(如 1/2/3、I/Y/W),前端顯示需轉為可讀文字(如「在廠產品」)。本文整理 DataGrid 與 Repeater 中,透過 TemplateColumn/ItemTemplate 呼叫後端方法、內嵌三元運算子、字典查詢等多種轉換寫法。

DataGrid 範例


    
        
        
        
        
        
            
                <%# GetTransType(Eval("FLAG")) %>
            
        

        
        
            
                <%# (Common.Constant.CountryList.ContainsKey(Eval("COUNTRY") + "")) 
                    ? Common.Constant.CountryList[Eval("COUNTRY") + ""] 
                    : Eval("COUNTRY") + "" %>
            
        
    
// 後端轉換方法
public string GetTransType(object obj)
{
    string flag = Convert.ToString(obj);
    switch (flag)
    {
        case "1": return "在廠產品";
        case "2": return "在廠半成品";
        case "3": return "已出庫未報關成品";
        case "I": return "在廠原材料數量";
        case "Y": return "已報關未入庫料件數量";
        case "W": return "已入庫未報關料件數量";
        default: return flag; // 未知代碼直接顯示原值
    }
}

// 靜態字典範例 (Common.Constant.cs)
public static class Constant
{
    public static readonly Dictionary CountryList = new Dictionary
    {
        { "CN", "中國" }, { "US", "美國" }, { "JP", "日本" }, { "DE", "德國" }
    };
}

Repeater 範例


    
        
            
            
                
            
            <%# Eval("CustomerNo") %>
            <%# GetInOutText(Eval("IeType")) %>
            <%# Eval("TradeMode") %>
            <%# Eval("TotalQuantity") %>
            <%# Eval("TotalAmount") %>
            <%# Eval("ShipPeople") %>
            <%# Eval("ReceivePeople") %>
            
                
            
            <%# GetServiceTags(Eval("HasWMS"), Eval("HasFreight"), Eval("HasCustoms")) %>
            <%# Eval("CodeNameCn") %>
            <%# Convert.ToDateTime(Eval("CreateTime")).ToString("yyyy-MM-dd") %>
        
    
// 後端輔助方法
public string GetLink(object statusObj, object guidObj)
{
    string status = statusObj?.ToString() ?? "";
    string guid = guidObj?.ToString() ?? "";
    return status == "未下單" ? $"GjmyOrderSave.aspx?guid={guid}" : $"GjmyOrderDetail.aspx?guid={guid}";
}

public string GetInOutText(object ieType)
{
    return ieType?.ToString() == "I" ? "進倉" : "出倉";
}

public string GetXiadanText(object status)
{
    string s = status?.ToString() ?? "";
    return s == "未下單" ? "下單" : "查看";
}

public string GetServiceTags(object wms, object freight, object customs)
{
    var tags = new List();
    if (wms != DBNull.Value && Convert.ToBoolean(wms)) tags.Add("倉庫發貨");
    if (freight != DBNull.Value && Convert.ToBoolean(freight)) tags.Add("貨運代理");
    if (customs != DBNull.Value && Convert.ToBoolean(customs)) tags.Add("報關報檢");
    return string.Join(" ", tags);
}

進階技巧:ItemDataBound 事件中動態控制

若需根據資料列內容動態顯示/隱藏控制項、修改樣式,可在 ItemDataBound 處理:

protected void rpList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DataRowView row = (DataRowView)e.Item.DataItem;
        var lb = (LinkButton)e.Item.FindControl("lbXiadan");
        if (row["Status"].ToString() == "已取消")
        {
            lb.Visible = false; // 或 lb.Enabled = false; lb.CssClass = "disabled";
        }
    }
}

最佳實踐建議

  • 集中管理代碼表:將所有代碼對照表放在 Common.Constant 或資料庫快取,避免硬編碼分散。
  • 優先使用字典/查詢表:Dictionary.TryGetValue 比 switch 效能更好且易維護。
  • 處理 DBNull:Eval 回傳可能為 DBNull.Value,轉字串前請先判斷。
  • 邏輯移出標記:複雜轉換邏輯盡量寫在後端方法,標記保持簡潔,利於維護與單元測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved