2013-05-13 24 views
1

我的頁面上有一個DetailsView控件,用於編輯記錄的各個字段,在這方面效果很好。DetailsView在ASP.Net - 如何添加另一列在一側/添加控制在每一行?

我正在尋找一種方法來添加一列(如果它工作,爲什麼不多)右側,這將是絕對只讀的,以顯示另一個記錄的相同字段進行比較。

我知道沒有明顯的方法可以用DetailsView來開箱這種事情。我已經看過其他控件(轉換GridView,有人推薦FormView,ListView),但沒有任何滿足。我使用DetailsView進行了一些非常特殊的數據綁定設置,我無法擺脫它而不會丟失某些功能。

任何人如何在DetailsView上「侵入」附加列(僅用於顯示)?

+0

您可以更新您當前使用的代碼的問題數據綁定的DetailsView? – jadarnel27 2013-05-14 12:09:15

+0

您打算從「只讀」列中獲取價值? – Marcianin 2013-05-14 15:30:54

回答

1

我現在的解決方案是使用第二個DetailsViewVisible在我的aspx中設置爲False。 在代碼中,我確保DataBind隱藏DetailsView,它首先託管我的第三列的數據,然後是名爲ItemDetails的初始DetailsView

而且在項目創建的事件,我傳遞給第三個欄我隱藏控件的HTML渲染(在最後的代碼塊):

protected void ItemDetails_ItemCreated(object sender, EventArgs e) 
     { 
      if (dataItem2 != null) //compare enabled 
      { 
       var headerRow = ((DetailsView)sender).HeaderRow; 
       var headerL = new Label(); 
       headerL.Text = header2; 
       headerL.Style.Add("font-weight", "bold"); 
       var headerCell = new TableCell(); 
       headerCell.Controls.Add(headerL); 
       headerCell.Style.Add("text-align", "right"); 
       headerRow.Cells.Add(headerCell); 
       if (string.IsNullOrEmpty(header1) && string.IsNullOrEmpty(header2)) ((DetailsView)sender).HeaderRow.Visible = false; 
      } 
      else 
      { 
       ((DetailsView)sender).HeaderRow.Visible = false; 
      } 
      foreach (DetailsViewRow r in ItemDetails.Rows) 
      { 
       if (r.RowType == DataControlRowType.DataRow) 
       { 
        // Assume the first cell is a header cell   
        var dataCell = (DataControlFieldCell)r.Cells[0]; 
        string dataFieldName = null; 
        if (dataCell.ContainingField is CustomBoundField) dataFieldName = ((CustomBoundField)dataCell.ContainingField).GetDataFieldName(); 
        else if (dataCell.ContainingField is BoundField) dataFieldName = ((BoundField)dataCell.ContainingField).DataField; 
        if (dataItem2 != null) //compare enabled 
        { 
         if (!string.IsNullOrEmpty(dataFieldName)) //it's a field, copy boundField from hidden DetailsView 
         { 
          var ct = new TableCell(); 
          var text = new StringWriter(); 
          var html = new HtmlTextWriter(text); 
          dict[dataFieldName].RenderControl(html); 
          ct.Text = text.ToString().Replace("<td>", String.Empty).Replace("</td>", String.Empty); 
          r.Cells.Add(ct); 
         } 
        } 
       } 
      } 
     }