2012-12-06 31 views
0

我一直试图利用DetailsView过去几天来显示和编辑来自GridView的单个记录中的数据,它们都从SqlDataSource中读取它们的数据。DetailsView无法计算如何触发更新事件

我一直在搜索互联网和MSDN有关如何使用DetailsView编辑数据的信息,我设法凑齐一些东西在一起,问题是,显然实际的更新方法不运行。

因此,这里是我的代码

的GridView在页面的摘录:

Private Sub SetupDataSource() 'this is the sqldatasource I'm using for the detailsview 

    SqlDataSource2.ConnectionString = Assist.connectionString 
    SqlDataSource2.SelectCommand = detailsSelect 
    SqlDataSource2.SelectParameters.Add(New Parameter("id")) 

    SqlDataSource2.UpdateCommand = detailsUpdate 
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_cod")) 
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_desc")) 
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_user")) 
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_pass")) 
    SqlDataSource2.UpdateParameters.Add(New Parameter("cli_admin")) 

End Sub 

Private Sub SetupDetailsView(id As Int32) 
    DetailsView1.AutoGenerateRows = False 
    DetailsView1.DataSource = SqlDataSource2 

    SqlDataSource2.SelectParameters("id").DefaultValue = id 

End Sub 

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

    If Not IsPostBack Then 
     Dim id As String = Request.QueryString("id") 
     If id <> "" Then 

      SetupDetailsView(id) 
      DetailsView1.DataBind() 
     End If 
    End If 
End Sub 

    Protected Sub DetailsView1_ItemUpdating(sender As Object, e As DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating 
    Dim cliCod As String = (CType(DetailsView1.FindControl("txtCliCod"), TextBox)).Text.ToString() 
    Dim cliDesc As String = (CType(DetailsView1.FindControl("txtCliDesc"), TextBox)).Text.ToString() 
    Dim cliUser As String = (CType(DetailsView1.FindControl("txtCliUser"), TextBox)).Text.ToString() 
    Dim cliPass As String = (CType(DetailsView1.FindControl("txtCliPass"), TextBox)).Text.ToString() 
    Dim cliAdmin As Boolean = If((CType(DetailsView1.FindControl("chkCliAdminE"), CheckBox)).Checked = True, True, False) 

    SqlDataSource2.UpdateParameters("cli_cod").DefaultValue = cliCod 
    SqlDataSource2.UpdateParameters("cli_desc").DefaultValue = cliDesc 
    SqlDataSource2.UpdateParameters("cli_user").DefaultValue = cliUser 
    SqlDataSource2.UpdateParameters("cli_pass").DefaultValue = cliPass 
    SqlDataSource2.UpdateParameters("cli_Admin").DefaultValue = If(cliAdmin = True, "1", "0") 


    DetailsView1.DataBind() 
End Sub 

我要么失去了一些东西:代码隐藏的

   <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" AutoGenerateRows="False" DefaultMode="Edit"> 
        <fields> 
         <asp:TemplateField HeaderText="Codice Cliente"> 
          <ItemTemplate> 
           <asp:Label ID="lblCliCod" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_cod") %>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:TextBox ID="txtCliCod" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_cod")%>'></asp:TextBox> 
          </EditItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField HeaderText="Descrizione"> 
          <ItemTemplate> 
           <asp:Label ID="lblCliDesc" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_desc")%>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:TextBox ID="txtCliDesc" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_desc")%>'></asp:TextBox> 
          </EditItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField HeaderText="Nome Utente"> 
          <ItemTemplate> 
           <asp:Label ID="lblCliUser" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_user")%>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:TextBox ID="txtCliUser" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_user")%>'></asp:TextBox> 
          </EditItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField HeaderText="Password"> 
          <ItemTemplate> 
           <asp:Label ID="lblCliPass" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_pass")%>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:TextBox ID="txtCliPass" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_pass")%>'></asp:TextBox> 
          </EditItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField HeaderText="Amministratore"> 
          <ItemTemplate> 
           <asp:Label ID="lblCliAdmin" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.cli_admin")%>'></asp:Label> 

          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:CheckBox ID="chkCliAdminE" runat="server" Text='<%# CBool(DataBinder.Eval(Container, "DataItem.cli_admin"))%>' /> 
          </EditItemTemplate> 
         </asp:TemplateField> 

         <asp:TemplateField> 
          <EditItemTemplate> 

           <asp:LinkButton Text="Aggiorna" ID="UpdateButton" runat="Server" CommandName="Update"></asp:LinkButton> 
           <asp:LinkButton Text="Elimina" ID="DeleteButton" runat="server" CommandName="Edit"></asp:LinkButton> 
          </EditItemTemplate> 
         </asp:TemplateField> 
        </fields> 
       </asp:DetailsView> 

相关部分或者在某个地方做错了,这是为什么?

回答

0

我不是在使用的SqlDataSource专家,但你可以尝试在你的Item_Updating方法插入SqlDataSource.Update

SqlDataSource2.UpdateParameters("cli_cod").DefaultValue = cliCod 
SqlDataSource2.UpdateParameters("cli_desc").DefaultValue = cliDesc 
SqlDataSource2.UpdateParameters("cli_user").DefaultValue = cliUser 
SqlDataSource2.UpdateParameters("cli_pass").DefaultValue = cliPass 
SqlDataSource2.UpdateParameters("cli_Admin").DefaultValue = If(cliAdmin = True, "1", "0") 

SqlDataSource2.Update(); 

DetailsView1.DataBind() 
+0

我希望这是问题,当点击更新按钮 – MaddoScientisto

+0

确定这是一个问题时,item_updating甚至没有被调用,我必须感谢你,现在我得到了另一个问题关于不调用更新方法的自定义更新按钮 – MaddoScientisto

0

我在一个正在进行的项目中使用一个DetailsView。他们是挑剔的,但它们在正确设置时工作得很好。

我可以用你的DetailsView看到一些潜在的问题是:

评估和演示VS绑定

与所有的数据绑定控件,DataBinder.Eval方法是只读的数据绑定方法。要允许控件自动更新,您必须在编辑模板中使用绑定。当然,您可以手动更新数据库,但为什么要重新发明轮子?

<asp:TemplateField HeaderText="Codice Cliente"> 
<ItemTemplate> 
<asp:Label ID="lblCliCod" runat="server" Text='<%# Eval("DataItem.cli_cod") %>'></asp:Label> 
</ItemTemplate> 
<EditItemTemplate> 
<asp:TextBox ID="txtCliCod" runat="server" Text='<%# Bind("DataItem.cli_cod")%>'></asp:TextBox> 
</EditItemTemplate> 
</asp:TemplateField> 

内置更新功能VS手动更新功能

你并不真的需要使用DetailsView1_ItemUpdating除非你是想赶上和修改值后提交并承诺前数据源。即将单独的年/月/日文本框连接成单个日期。

但是,由于您目前没有生成更新按钮(使用属性AutoGenerateEditButton =“True”),因此您可能需要按照您尝试的方式手动处理更新。或者,对于基本绑定和更新,我会注释掉更新函数,添加autogenerateeditbutton =“True”属性,然后尝试更新。

主键

对于某些数据源,您必须在指定的DetailsView DataKeyNames属性(你的数据源的主键/秒),以实现自动绑定。我不确定,但您可能还需要设置DefaultMode属性。

所有的属性和方法在MSDN DetailsView page上都有很好的解释,但它很冗长。MSDN Updating a DetailsView page更简洁

+0

这真的很有趣,我一直在做所有这些eval的东西,因为这是我在一个示例somwhere中找到的,我仍然试图完全掌握如何管理所有这些东西,感谢提示 – MaddoScientisto

+0

关于更新按钮,我尝试了集成的按钮,他们实际上工作,我仍然不知道为什么自定义按钮不会通过,我记得一个MSND文章说任何自定义按钮CommandName =“编辑“ 会工作 – MaddoScientisto