2014-12-18 3 views
0

Я знаю, что это старая тема, но ни одно из решений, которые мне кажутся, не помогает. Я новичок в этом, поэтому, пожалуйста, помогите мне: Я делаю звонок в базу данных для извлечения записей, которые затем отображаются в виде сетки вместе с флажком. При щелчке по флажку мне нужно сохранить отмеченные записи строк в отдельной таблице вместе с некоторой другой запрошенной информацией в инструкции insert. Проблема в том, что первое имя и фамилия не заполняются, что приводит к нулевому исключению. Может ли кто-нибудь просмотреть это и дать мне знать, как его решить?Получение значений строк из gridview checkbox

Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Web.UI.WebControls 
Partial Class scores 
Inherits System.Web.UI.Page 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
    Me.GridView1.DataBind() 
End Sub 
Protected Sub Save_Click(sender As Object, e As EventArgs) Handles Save.Click 
    For Each row As GridViewRow In GridView1.Rows 
     Dim chkrow As CheckBox = DirectCast(row.FindControl("cb1"), CheckBox) 
     If chkrow.Checked = True Then 
      Dim firstname As TextBox = DirectCast(row.FindControl("firstname"), TextBox) 
      Dim lastname As TextBox = DirectCast(row.FindControl("lastname"), TextBox) 
      Dim conn As New SqlClient.SqlConnection 
      Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand() 
      conn.ConnectionString = "Data Source=SERVERNAME;Persist Security Info=True;User ID=ME;Password=PASSWORD;Initial Catalog=Testing" 
      cmd.Connection = conn 
      cmd.CommandText = "insert into scores (date, test, score, personid, testid) Values (getdate(), @test, @score, (select personid from persons where firstname = '" + firstname.Text + "' and lastname = '" + lastname.Text + "'), (select testid from tests where testnm ='" + DDL2.SelectedValue + "'))" 
      conn.Open() 
      Try 
       cmd.Parameters.Add("@test", SqlDbType.NVarChar).Value = DDL2.SelectedValue 
       cmd.Parameters.Add("@score", SqlDbType.NVarChar).Value = Score.Text 
       cmd.ExecuteNonQuery() 
       Response.Write("Saved") 
      Catch ex As System.Data.SqlClient.SqlException 
       MsgBox(ex.Message) 
       conn.Close() 
      End Try 
      Exit For 
     End If 
    Next 
End Sub 

End Class

И разметки страницы:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="scores.aspx.vb" Inherits="scores" %> 

    <!DOCTYPE html> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
     <div> 

      Scores<br /><br /> 
      Pick tester name <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="personid" 
DataSourceID="SqlDataSource1"> 
       <Columns> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <asp:CheckBox ID="CB1" runat="server" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:BoundField DataField="personid" HeaderText="personid" InsertVisible="False" ReadOnly="True" SortExpression="personid" /> 
        <asp:BoundField DataField="Firstname" HeaderText="Firstname" SortExpression="Firstname" /> 
        <asp:BoundField DataField="Lastname" HeaderText="Lastname" SortExpression="Lastname" /> 
        <asp:BoundField DataField="Social" HeaderText="Social" SortExpression="Social" /> 
       </Columns> 
      </asp:GridView> 
      <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Testing %>" SelectCommand="SELECT [personid], [Firstname], [Lastname], [Social] FROM [Persons] where [personid] not in (select personid from scores) ORDER BY [Lastname] "></asp:SqlDataSource> 
      Test taken <asp:DropDownList ID="DDL2" runat="server" DataSourceID="SqlDataSource2" DataTextField="TestNM" DataValueField="TestNM"></asp:DropDownList> 
      <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:Testing %>" SelectCommand="SELECT [TestNM], [testid] FROM [Tests] ORDER BY [TestNM]"></asp:SqlDataSource> 
      Score <asp:TextBox ID="Score" runat="server"></asp:TextBox><br /> 
      <asp:Button ID="Save" runat="server" Text="Save" /> 
     </div> 
     </form> 
    </body> 
    </html> 

ответ

0

Он смотрит на меня, как будто вы заново связывании все данные (в Page_Load), прежде чем читать. Попробуйте сначала проверить обратную передачу:

If Not Page.IsPostback Then 
    Me.GridView1.DataBind() 
End If 
+0

Без изменений при добавлении этого кода. Когда я перехожу через код, имя и фамилия не заполняются, поэтому до сих пор ссылка на объект не задана на экземпляр объекта. Трассировка стека указывала на запрос sql, но этот запрос выполняется нормально, когда я заменяю переменные в анализаторе запросов. –

Смежные вопросы