VB.net - установить флажок Gridview для обновления логического поля в базе данных - PullRequest
0 голосов
/ 08 февраля 2011

Есть много вопросов по этому поводу, но я не смог решить свою проблему, используя ответы на какие-либо из них (после многих, многих попыток ..)

Я работаю в vb.создание веб-приложения asp.net.У меня есть SqlDataSource и GridView на моей странице.

Я хочу изменить логическое значение DoNotMail, представленное флажком Gridview, и автоматически обновлять в базе данных, если флажок установлен с 0 (False, Will Mail) на 1 (True, Wothing Mail).код, который я использовал.

Для кода default.aspx.vb я добавил:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    lastname.Focus()
    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)
    With Me.SqlDataSource1
        Dim box As CheckBox = DirectCast(sender, CheckBox)
        If box.Checked = True Then
            donotmail.SelectedValue = 1

            .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
            .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
        Else
            donotmail.SelectedValue = 0

            .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
            .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
        End If
    End With

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> 

1) ЯЯ почти уверен, что мой синтаксис в команде update неправильный в разделе кода по умолчанию.Кто-нибудь знает правильный синтаксис?
2) Я получаю сообщение об ошибке: Когда я добавляю «Handles CheckBox1.CheckedChanged» под разделом кода, CheckBox1 подчеркивается и получает следующую ошибку: «Для предложения Handles требуется переменная WithEvents, определенная всодержащий тип или один из его базовых типов ".Как мне избавиться от этого?Я просто удалил строку и запустил код без нее.3) После установки флажка «текст DoNotMail был изменен в базе данных для выбранного поля» текст отображается в верхней части страницы, но если я перезапущу поиск для donotmail = 1, запись не отображаетсявверх, потому что он никогда не обновлялся с новым значением.

Я довольно тупой.Кто-нибудь может помочь?Было бы очень признателен:)

Спасибо за ответ Ник!Оператор UPDATE не будет работать, потому что в нем нет предложения WHERE.Он обновит всю таблицу как есть.Там нет первичного ключа для таблицы.Вот столбцы для таблицы FROM [AgentLeads]. [Dbo]. [MktDtaLeads_Scrubbed] - [Фамилия], [Имя], [Отчество], [Суффикс], [Адресная строка 1], [Адресная строка 2], [Город], [ST], [ZipCode], [Адрес электронной почты], [Телефон Nbr], [Бесплатный бесплатный Nbr], [InsertDate], [SentDate], [DoNotMail]

Где AgentLeads - этобазы данных и MktDtaLeads_Scrubbed является таблицей.Как мне указать строку?Итак, я бы поставил:

.UpdateCommand = "ОБНОВИТЬ MktDataLeads_scrubbed set donotmail = @ donotmail" ГДЕ [фамилия] = @ lastname.selectedrow AND [имя] = @ firstname.selectedrow AND [Адресная строка 1] =@ Адресная строка 1.selectedrow

Можно ли выполнить двухстороннюю синхронизацию для всего вида сетки, когда пользователь нажимает кнопку, чтобы вам не приходилось обновлять каждый раз при изменении строки?потому что пользователь может установить флажок, а затем установить другой флажок, затем снять флажок, и будет много обновлений ...

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Вы захотите использовать событие GridView.RowCommand

Обязательно добавьте прослушиватель OnRowCommand в GridView, затем обновите соответствующим образом

Public Sub gridview1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
     If e.CommandName = "UpdateDoNotMail" Then
        With Me.SqlDataSource1
           Dim box As CheckBox = DirectCast(sender, CheckBox)
           If box.Checked = True Then
               donotmail.SelectedValue = 1

               .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
               .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
           Else
               donotmail.SelectedValue = 0

               .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
               .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail"
           End If
       End With
    End If
End Sub

и TemplateField

             <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
             <ItemTemplate>         
             <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>'
                           Enabled="true" />     
             </ItemTemplate>     
             <EditItemTemplate>         
             <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>' />     
             </EditItemTemplate>       
             </asp:TemplateField> 
0 голосов
/ 09 февраля 2011

В итоге я получил разрешение на добавление столбца первичного ключа в базу данных по имени ID, чтобы легче вызывать каждую запись и оптимизировать код, вызывая хранимую процедуру из db (быстрее) вместо запуска команд SQL изКод позади (медленнее).

Для default.aspx.vb, который я поставил:

Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged 
    With Me.SqlDataSource1
        Dim connectionString As String = ConfigurationManager.ConnectionStrings("AgentLeadsConnectionString").ConnectionString


        .UpdateParameters.Clear()

        .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString
        .UpdateCommand = "up_UpdateMktDataLeads"
        .UpdateParameters.Add("donotmail", Me.donotmail.Text)
        .UpdateCommandType = SqlDataSourceCommandType.StoredProcedure

    End With

    GridView2.DataBind()

End Sub

Вот хранимая процедура, вызываемая кодом:

     PROCEDURE [dbo].[up_UpdateMktLeadsDoNotMail]

           @ID integer, 
           @DoNotMail bit

     AS

     UPDATE [dbo].[MktDtaLeads_Scrubbed]

     SET [DoNotMail] = @DoNotMail

     WHERE [ID] = @ID

Вот кодирование внешнего интерфейса дляGridView на default.aspx:

        <asp:GridView ID="GridView2" runat="server" CellPadding="2" 
            DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" 
            AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="Last Name" HeaderText="Last Name" 
                    SortExpression="Last Name" />
                <asp:BoundField DataField="First Name" HeaderText="First Name" 
                    SortExpression="First Name" />
                <asp:BoundField DataField="Address Line 1" HeaderText="Addr 1" 
                    SortExpression="Address Line 1" />
                <asp:BoundField DataField="Address Line 2" HeaderText="Addr 2" 
                    SortExpression="Address Line 2" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="ST" HeaderText="ST" SortExpression="ST" />
                <asp:BoundField DataField="ZipCode" HeaderText="ZipCode" 
                    SortExpression="ZipCode" />
                <asp:BoundField DataField="Email Address" HeaderText="Email Addr" 
                    SortExpression="Email Address" />
                <asp:BoundField DataField="Phone Nbr" HeaderText="Phone Nbr" 
                    SortExpression="Phone Nbr" />

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

            </Columns>
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <RowStyle BackColor="#EFF3FB" Font-Size="Smaller" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <EditRowStyle BackColor="#2461BF" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
0 голосов
/ 09 февраля 2011

Вот код для GridView на default.aspx:

Я использовал вариант кода, подробно описанный на этой странице, и заставил его работать! vb.net SQL-запрос работает на SQL-сервере, но не при вызове из флажка

Для кода default.aspx.vb позади я добавил:

    Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged
    Dim connectionString As String = ConfigurationManager.ConnectionStrings("AgentLeadsConnectionString").ConnectionString


    Dim box As CheckBox = DirectCast(sender, CheckBox)
    Dim tblcell As TableCell = CType(box.Parent, TableCell)
    Dim dgRow As GridViewRow = CType(tblcell.Parent, GridViewRow)

    Dim lastname As String = [last name].Rows(dgRow.DataItemIndex).Cells(0).Text
    Dim firstname As String = [first name].Rows(dgRow.DataItemIndex).Cells(0).Text
    Dim address As String = [Address Line1].Rows(dgRow.DataItemIndex).Cells(0).Text

    Dim insertSQL As String

    If box.Checked = True Then
        insertSQL = "UPDATE MktDataLeads_scrubbed "
        insertSQL &= "SET donotmail=1 "
        insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
    Else
        insertSQL = "UPDATE MktDataLeads_scrubbed "
        insertSQL &= "SET donotmail=0 "
        insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
    End If

    Using con As New SqlConnection(connectionString)
        Dim cmd As New SqlCommand(insertSQL, con)
        cmd.Parameters.AddWithValue("@donotmail", donotmail)
        Try
            con.Open()
            cmd.ExecuteNonQuery()
        Catch Err As SqlException
            MsgBox("Error", 65584, "Insertion Error")
        End Try
        con.Close()
    End Using

End Sub

Дляgridview Я использовал тот же код:

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