【问题标题】:DetailsView in ASP.Net - How to add another column on the side/add a control in each row?ASP.Net 中的 DetailsView - 如何在侧面添加另一列/在每一行中添加一个控件?
【发布时间】:2013-05-13 16:22:28
【问题描述】:

我的页面上有一个DetailsView 控件,用于编辑记录的各个字段,在这方面效果很好。

我正在寻找一种在右侧添加一列(如果可行,为什么不增加)的方法,这将是绝对只读的,以显示另一条记录的相同字段以进行比较。

我知道没有明显的方法可以使用DetailsView 开箱即用地执行此类操作。我研究了其他控件(转置GridView,有人推荐FormViewListView),但没有什么令人满意的。我使用DetailsView 进行了一些非常特殊的数据绑定设置,并且在不丢失某些功能的情况下无法摆脱它。

有人知道如何“破解”DetailsView 上的其他列(仅用于显示)吗?

【问题讨论】:

  • 您能用您当前用于对 DetailsView 进行数据绑定的代码更新问题吗?
  • 从哪里获取“只读”列的值?

标签: c# asp.net detailsview


【解决方案1】:

我现在的解决方案是使用第二个DetailsView,在我的aspx 中将Visible 设置为False。 在代码中,我确保 DataBind 隐藏的 DetailsView 首先托管我的第三列的数据,然后是最初的 DetailsView ItemDetails

在项目创建事件中,我将隐藏控件的 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);
                        }
                    }
                }
            } 
        }

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多