将ASP.Net DetailsView置于编辑模式和更新模式

时间:2012-11-30 15:41:24

标签: asp.net vb.net detailsview updatemodel editmode

我们正在使用带有VB.Net代码隐藏文件的ASP.Net DetailsView。我们试图允许用户编辑并保存DetailsView中的更改,方法是允许用户单击“编辑”按钮,然后单击“更新”按钮。

当用户单击“编辑”按钮时没有任何反应,因此我们为“编辑”按钮添加了OnClick处理程序。 DetailsView将进入编辑模式,但前提是用户单击两次“编辑”按钮。 (也许是一个ASP.Net错误?)

一旦DetailsView处于编辑模式,更新和取消按钮将按预期显示,但当用户单击其中任何一个按钮时,没有任何反应。我们在Update按钮上放置一个OnClick,试图强制DetailsView更新但是.ChangeMode(DetailsViewMode。的唯一选择是Edit,Insert,ReadOnly。

我还认为DetailsViews不需要额外的OnClicks,除非我们需要执行特殊处理。

以下是DetailsView的标记:

<asp:DetailsView 
    ID="DetailsView" 
    runat="server" 
    Height="50px" 
    Width="218px" AutoGenerateRows="False">

    <Fields>

        <asp:TemplateField ShowHeader="False">

            <EditItemTemplate>
                <asp:Button ID="ButtonUpdate" runat="server" CausesValidation="True" 
                    CommandName="Update" Text="Update" OnClick="ButtonUpdate_Click"  />
                &nbsp;<asp:Button ID="ButtonCancelUpdate" runat="server" CausesValidation="False" 
                    CommandName="Cancel" Text="Cancel" />
            </EditItemTemplate>

            <ItemTemplate>
                <asp:Button ID="ButtonEdit" runat="server" CausesValidation="False" 
                    CommandName="Edit" Text="Edit" OnClick="ButtonEdit_Click"/>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:BoundField DataField="Forename" HeaderText="First Name:" />
    </Fields>
</asp:DetailsView>

以下是代码隐藏文件中的编码:

Public Class StudentDetailsMaintenance
    Inherits System.Web.UI.Page

    Dim theTableAdapter As New DataSetSingleStudentTableAdapters.StudentsMaintenanceTableAdapter

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' Load the data from the database into the DetailsView.
        '------------------------------------------------------
        DetailsView.DataSource = theTableAdapter.GetDataByStudentID(StudentMaintenance.IntStudentID)
        DetailsView.DataBind()
    End Sub

    Protected Sub ButtonEdit_Click(sender As Object, e As EventArgs)

        ' Place the DetailsView into Edit mode.
        '--------------------------------------
        DetailsView.ChangeMode(DetailsViewMode.Edit)
    End Sub

    Protected Sub ButtonUpdate_Click(sender As Object, e As EventArgs)

        ' Place the DetailsView into Update mode.
        '----------------------------------------
        DetailsView.ChangeMode(DetailsViewMode.)
    End Sub
End Class

ButtonUpdate_Click例程不完整,因为我们不知道如何让DetailsView进行更新。

附加说明: 这是我们第一次尝试通过不在标记中设置DataSource来执行DetailsView。我们没有这样做,而是使用DataSet设计器中创建的DataSet TableAdapter中的数据。

如果我们在标记中使用了DetailsView以及DataSource,则编辑和更新按钮可以正常工作。我们也这样做是为了尽可能消除额外的编码。

2 个答案:

答案 0 :(得分:3)

如果你想要DetailsView的Edit自动行为,你需要使用CommandField来显示Edit按钮:

<asp:DetailsView id="dvDetailsView" runat="server" DataSourceId="sqlDS" DataKeyNames="primaryKey">
  <Fields>
    <asp:CommandField ButtonType="Button" ShowEditButton="true" />
  </Fields>
</asp:DetailsView>

如上所述,您需要包含DataKeyNames属性以指定数据源的主键,以便ASP.NET知道要更新的数据源中的哪条记录。同样如上所述,您需要确保Bind(“columnName”)语句使用与数据存储中使用的字段名称相同的字段名称。

另外,请确保在SqlDataProvider中提供UpdateCommand(或数据存储的等效项),以便进行更新。

现在,当您将DetailsView置于编辑模式时,更新和取消按钮将自动显示在其中。如果在数据存储中更新数据之前需要对数据进行一些处理,那么在后面的代码中处理DetailView的ItemUpdating事件。

答案 1 :(得分:2)

好吧,简单地看一下,尝试将Page_Load数据绑定包装在If Not Page.IsPostback中。

回发对数据绑定控件造成严重破坏。