2010-11-21 7 views
1

Il y a beaucoup de questions à ce sujet mais je n'ai pas réussi à résoudre mon problème en utilisant les réponses à l'un d'eux (après de nombreuses tentatives ..)VB.net - make Gridview case à cocher mise à jour champ booléen dans la base de données

Je travaille sur vb.net en créant une application web asp.net. J'ai un SqlDataSource et un GridView sur ma page:

<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> 

Le GridView est rempli correctement, avec les cases des valeurs correctement affichées (le « champ readit » est un champ de bits, à savoir booléen). J'essaye d'obtenir le script pour mettre à jour la valeur booléenne dans la base de données quand la case est cliquée. Pour le moment, je ne peux même pas obtenir le script pour réagir à un clic (pas même un MsgBox).

Voici mon CodeBehind:

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 

Comme vous pouvez le voir, je jouais avec WithEvents mais cela ne semble pas aider. Dans le code ci-dessus, tout ce que j'essayais d'obtenir était une sorte de réaction au clic d'une case à cocher - mais rien ne se passe (pas d'erreurs non plus).

Je suis assez perplexe. Quelqu'un peut-il aider? Serait très apprécié :)

Répondre

1

Après beaucoup faffing à propos J'ai fini avec ce code dans le fichier 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> 

... et cela dans le 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 

... qui tire correctement sur la en cliquant sur chaque case à cocher. Maintenant pour les faire faire quelque chose d'utile ...

0

changement

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 

Fondamentalement, vous avez oublié les poignées CheckBox1.CheckedChange à la fin.

+0

Merci pour la réponse. Quand j'ajoute que je n'ai toujours pas de commentaires - le MsgBox ne fonctionne pas :( – melat0nin

0

Erreur: Lorsque j'ajoute "Handles CheckBox1.CheckedChanged" sous le code derrière la section, CheckBox1 est souligné et obtient l'erreur suivante: "La clause Handles nécessite une variable WithEvents définie dans le contenant le type ou l'un de ses types de base ". Comment puis-je me débarrasser de cela? J'ai juste supprimé la ligne et couru le code sans cela. Pour modifier la valeur booléenne DoNotMail représentée par une case à cocher Gridview et mettre à jour automatiquement dans la base de données si la case est cochée de 0 (False, Will Mail) à 1 (True, Will Mail), voici le code que j'ai utilisé .

Pour le code Default.aspx.vb derrière I ajouté:

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 

Pour la page default.aspx j'ai ajouté:

    <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> 
Questions connexes