C#填充DetailsView的不那么模糊的方法?

时间:2010-10-31 19:40:20

标签: c# asp.net gridview detailsview

我似乎无法将单个GridView的行正确绑定到DetailsView。目前我有这个:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Web.UI.WebControls;

namespace WebApp
{
    public partial class CrudGrid : System.Web.UI.UserControl
    {
        public const string EditCommand = "EditDialog";

        public object DataSource
        {
            get { return Grid.DataSource; }
            set { Grid.DataSource = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void Grid_OnRowCommand(object sender, GridViewCommandEventArgs e)
        {
            switch(e.CommandName)
            {
                case EditCommand:
                {
                    int index;

                    if(!int.TryParse(e.CommandArgument.ToString(), out index))
                        throw new ArgumentException();

                    TableCellCollection cells = Grid.Rows[index].Cells;

                    Details.DataSource = new object[] { new DataSourceProvider(cells[2].Text, cells[3].Text, cells[4].Text) };
                    Details.DataBind();

                    DetailsPanel.Update();
                    break;
                }
            }
        }

        protected void Grid_OnRowDeleting(object sender, GridViewDeleteEventArgs e)
        {
        }

        private class DataSourceProvider
        {
            public string Cell1 { get; set; }
            public string Cell2 { get; set; }
            public string Cell3 { get; set; }

            public DataSourceProvider(string cell1, string cell2, string cell3)
            {
                Cell1 = cell1;
                Cell2 = cell2;
                Cell3 = cell3;
            }
        }
    }
}

和客户端:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CrudGrid.ascx.cs" Inherits="Firelight.WebApp.WebControls.CrudGrid" %>

<asp:UpdatePanel ID="GridPanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:ImageButton ID="GridInsert" ImageUrl="/images/crud/insert.png" runat="server" />

        <asp:GridView ID="Grid" GridLines="None" AllowPaging="true" PageSize="15" runat="server"
            OnRowCommand="Grid_OnRowCommand"
            OnRowDeleting="Grid_OnRowDeleting"
        >
            <Columns>
                <asp:ButtonField CommandName="EditDialog" ButtonType="Image" ImageUrl="/images/crud/edit.png" HeaderImageUrl="/images/crud/edit.png" />
                <asp:ButtonField CommandName="Delete" ButtonType="Image" ImageUrl="/images/crud/delete.png" HeaderImageUrl="/images/crud/delete.png" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="DetailsPanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:DetailsView ID="Details" GridLines="None" runat="server"
         AutoGenerateRows="true" DefaultMode="ReadOnly" AllowPaging="false">
        </asp:DetailsView>
    </ContentTemplate>
</asp:UpdatePanel>

这个“有效”:我在详细信息视图中得到一个列表,列出我手动构建到类中的单元格...

我真正想要的是与

相似的东西
Details.DataSource = Grid.Rows[index]

枚举字段及其名称,但这似乎也无法正常工作。

任何建议或想法?

这适用于用户控件,以防它发生任何变化。

1 个答案:

答案 0 :(得分:0)

为什么不使用gridview项目作为详细信息视图的控件参数来使用master / details方法来执行此操作?

<asp:DetailsView AutoGenerateRows="False" DataKeyNames="au_id" DataSourceID="SqlDataSource3"
        HeaderText="Author Details" ID="DetailsView1" runat="server" Width="275px">
        <Fields>
          <asp:BoundField DataField="au_id" HeaderText="au_id" ReadOnly="True" SortExpression="au_id" />
          <asp:BoundField DataField="au_lname" HeaderText="au_lname" SortExpression="au_lname" />
                   </Fields>
      </asp:DetailsView>
      <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Pubs %>" ID="SqlDataSource3"
        runat="server" SelectCommand="SELECT [au_id], [au_lname] FROM [authors] WHERE ([au_id] = @au_id)">
        <SelectParameters>
          <asp:ControlParameter ControlID="GridView1" Name="au_id" PropertyName="SelectedValue"
            Type="String" />
        </SelectParameters>
      </asp:SqlDataSource>

这样的事情: http://quickstarts.asp.net/QuickStartv20/util/srcview.aspx?path=~/aspnet/samples/data/GridViewMasterDetails.src