将DetailsView设置为GridView的选定行

时间:2010-05-10 17:22:07

标签: c# asp.net objectdatasource

我正在创建一个GridView / DetailsView页面。我有一个显示一堆行的网格,当选择一行时,它使用DetailsView来允许插入/更新。

我的问题是将这些链接起来的最佳方法是什么?我不想再次访问Web服务,我需要的所有数据都在选定的网格视图行中。我基本上有两个独立的数据源,共享相同的“DataObjectTypeName”,第一个数据源检索数据,另一个数据源执行CRUD。

将选定网格视图行传输到详细信息视图的最佳方法是什么?我是否必须自己处理插入/更新事件并自己调用数据源?

是否无法将这两者联系起来以便使用相同的数据源?

  <asp:GridView ID="gvDetails" runat="server" DataKeyNames="ID, Code"
                DataSourceID="odsSearchData" >
   <Columns>
        <asp:BoundField DataField="RowA" HeaderText="A" SortExpression="RowA" />
        <asp:BoundField DataField="RowB" HeaderText="B" SortExpression="RowB" />
        <asp:BoundField DataField="RowC" HeaderText="C" SortExpression="RowC" />



    ....Code...

 <asp:DetailsView ID="dvDetails" runat="server" DataKeyNames="ID, Code"
                DataSourceID="odsCRUD" GridLines="None" DefaultMode="Edit" AutoGenerateRows="false"
                Visible="false" Width="100%">
         <Fields>
            <asp:BoundField DataField="RowA" HeaderText="A" SortExpression="RowA" />
           <asp:BoundField DataField="RowB" HeaderText="B" SortExpression="RowB" />
           <asp:BoundField DataField="RowC" HeaderText="C" SortExpression="RowC" />

...

2 个答案:

答案 0 :(得分:1)

执行此操作的标准方法是将griview的选定项目作为您连接到详细信息视图的objectdatasource的控制参数。我可能不会过多担心您已经拥有的数据转发的开销,除非您正在为那些连接速度很慢的用户提供服务,以避免不惜一切代价绕过网络服务器。

如果你真的想避免这种情况,那么你可以使用javascript / jquery从gridview中提取数据,然后通过ajax调用进行插入/更新。但它需要更多的编码。

答案 1 :(得分:0)

这是一个非常古老的线程,但是如果有人像我一样来这里寻找答案,一个简单的解决方案是将该函数添加到您的代码中:

(请注意,这仅在GridView中的行与DetailsView中的条目匹配时才有效。)

protected void GridView1_OnSelectedIndexChanged(object sender, EventArgs e)
{
     DetailsView1.SetPageIndex(GridView1.SelectedIndex);
}

并修改GridView和DetailsView以包括以下设置:

<asp:GridView ... OnSelectedIndexChanged="GridView1_OnSelectedIndexChanged" ... >
<asp:DetailsView ... AllowPaging="True" ... >

这将使DetailsView中的选定页面与GridView中的选定索引匹配。

如果您不希望用户在DetailsView中使用分页进行导航,则可以在DetailsView属性中隐藏分页选项。