2010-11-21 39 views
1

有很多关于这个问题,但我一直无法解决我的问题,使用任何人的答案(经过许多次尝试..)VB.net - 使数据库中的Gridview复选框更新布尔字段

我正在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玩,但似乎并没有帮助。在上面的代码中,我试图得到的是点击复选框的某种反应 - 但没有任何反应(也没有错误)。

我很难过。谁能帮忙?将不胜感激:)

回答

1

经过一番faffing约我结束了这段代码在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> 

...这在代码隐藏:

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 

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

0

变化

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 

基本上你忘了把手CheckBox1.CheckedChange底。

+0

感谢您的答复。当我补充说,我仍然没有得到任何反馈 - MsgBox不工作:( – melat0nin 2010-11-21 13:59:31

0

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

要更改由Gridview复选框表示的DoNotMail布尔值并在数据库中自动更新(如果复选框从0(False,Will Mail)复选到1(True,Will 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>