我似乎无法将单个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]
枚举字段及其名称,但这似乎也无法正常工作。
任何建议或想法?
这适用于用户控件,以防它发生任何变化。
答案 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>