【问题标题】:VB.net - make Gridview checkbox update boolean field in databaseVB.net - 使 Gridview 复选框更新数据库中的布尔字段
【发布时间】:2011-05-13 09:16:17
【问题描述】:

对此有很多问题,但我无法使用其中任何一个的答案来解决我的问题(经过多次尝试......)

我正在使用 vb.net 创建一个 asp.net Web 应用程序。我的页面上有一个 SqlDataSource 和一个 GridView:

<asp:SqlDataSource ID="msgUnread" runat="server" 
 ConnectionString="<%$ ConnectionStrings:edinsec %>" 

 SelectCommand="SELECT [msgdate], [email], [name], [message], [readit] FROM [messages]" 
 UpdateCommand="UPDATE messages SET readit = 'True' WHERE (msgid = @msgid)">
       <UpdateParameters>
     <asp:Parameter Name="msgid" />
 </UpdateParameters>
   </asp:SqlDataSource>


   <asp:GridView ID="unreadMessages" runat="server" AutoGenerateColumns="False" 
 BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" 
 CellPadding="3" DataSourceID="msgUnread">
 <RowStyle ForeColor="#000066" />
 <Columns>
     <asp:BoundField DataField="msgdate" HeaderText="Date &amp; time" 
         SortExpression="msgdate" />
     <asp:BoundField DataField="email" HeaderText="Email" 
         SortExpression="email" />
     <asp:BoundField DataField="name" HeaderText="Name" SortExpression="name" />
                 <asp:TemplateField HeaderText="Mark as read" SortExpression="readit">
         <%--<EditItemTemplate>
             <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("readit") %>'  OnCheckedChange="CheckBox1_CheckedChanged"  />
         </EditItemTemplate>--%>
         <ItemTemplate>
             <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("readit") %>' OnCheckChanged="CheckBox1_CheckedChanged" AutoPostBack="true"/>
         </ItemTemplate>
     </asp:TemplateField>
 </Columns>
 <FooterStyle BackColor="White" ForeColor="#000066" />
 <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
 <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
 <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
   </asp:GridView>

GridView 被正确填充,复选框的值被正确显示(“readit”字段是一个位字段,即布尔值)。我试图让脚本在单击复选框时更新数据库中的布尔值。目前,虽然我什至无法让脚本对点击做出反应(甚至不是 MsgBox)。

这是我的代码隐藏:

Public Partial Class enqur
Inherits System.Web.UI.Page
WithEvents CheckBox1 As CheckBox


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

End Sub

Public Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    MsgBox("test")
End Sub

End Class

如您所见,我正在使用 WithEvents,但这似乎没有帮助。在上面的代码中,我试图得到的只是对单击复选框的某种反应——但没有任何反应(也没有错误)。

我很困惑。任何人都可以帮忙吗?将不胜感激:)

【问题讨论】:

    标签: sql vb.net gridview checkbox


    【解决方案1】:

    错误:当我在代码后面部分添加“Handles CheckBox1.CheckedChanged”时,CheckBox1 带有下划线并出现以下错误:“Handles 子句需要在包含类型或其基本类型之一中定义的 WithEvents 变量”。我该如何摆脱它?我只是删除了该行并在没有它的情况下运行了代码。

    要更改由 Gridview 复选框表示的 DoNotMail 布尔值,并在复选框从 0(False,Will Mail)选中到 1(True,Won't Mail)时在数据库中自动更新,这是我使用的代码。

    对于default.aspx.vb后面的代码我加了:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        lastname.Focus() //sets the focus on the last name text box
        If Page.IsPostBack Then
            Response.Write("The DoNotMail value has been changed in the database for the selected field")
        End If
    
    End Sub
    
    Public Sub checkbox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim box As CheckBox = DirectCast(sender, CheckBox)
        If box.Checked = True Then
            donotmail.SelectedValue = 1
        Else
            donotmail.SelectedValue = 0
        End If
    
    
    End Sub
    

    对于我添加的default.aspx页面:

                     <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
                     <ItemTemplate>         
                     <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox1_CheckedChanged" Checked='<%# Bind("DoNotMail") %>'
                                   Enabled="true" />     
                     </ItemTemplate>     
                     <EditItemTemplate>         
                     <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox1_CheckedChanged" Checked='<%# Bind("DoNotMail") %>' />     
                     </EditItemTemplate>       
                     </asp:TemplateField>
    

    【讨论】:

      【解决方案2】:

      经过一番折腾,我最终在 aspx 文件中得到了这段代码:

      <asp:TemplateField HeaderText="readit" SortExpression="readit">
          <ItemTemplate>
              <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("readit") %>' 
                  Enabled="true" />
          </ItemTemplate>
          <EditItemTemplate>
              <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("readit") %>' />
          </EditItemTemplate>
            </asp:TemplateField>
      

      ...这在 CodeBehind 中:

      Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged
          Dim box As CheckBox = DirectCast(sender, CheckBox)
      
      
      
          If box.Checked = True Then
        MsgBox("checked!")
          Else
        MsgBox("unchecked!")
          End If
      
      
      
      End Sub
      

      ...在点击每个复选框时正确触发。现在让他们做一些有用的事情......

      【讨论】:

        【解决方案3】:

        改变

        Public Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        

        Public Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChange
        

        基本上你忘记了最后的 Handles CheckBox1.CheckedChange。

        【讨论】:

        • 感谢您的回复。当我补充说我仍然没有得到任何反馈时 - MsgBox 不工作:(
        猜你喜欢
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多