ASP.Net中的DetailsView-如何在边上添加另一列/在每行中添加一个控件
本文关键字:添加 一列 控件 一个 Net DetailsView- 中的 ASP | 更新日期: 2023-09-27 18:13:24
我的页面上有一个DetailsView
控件,用于编辑记录的各个字段,在这方面效果很好。
我正在寻找一种方法,在右边添加一列(如果有效,为什么不添加更多(,这将是绝对只读的,以显示另一条记录的相同字段,用于比较。
我知道DetailsView
没有明显的开箱即用的方法。我已经研究了其他控件(换位的GridView
,有人推荐了FormView
,ListView
(,但没有什么能满足。我使用DetailsView
进行了一些非常特殊的数据绑定设置,我无法摆脱它而不丢失一些功能。
有人知道如何在DetailsView
上"破解"其他列(仅用于显示(吗?
我现在的解决方案是使用第二个DetailsView
,在我的aspx中将Visible
设置为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);
}
}
}
}
}