2015-09-29 6 views
0

Я не могу обновить свою базу данных, когда установлен мой флажок, и нажмите кнопку «Проверить». Примечание: (Я использую Session для передачи своих данных по страницам)Обновление базы данных при нажатии кнопки «Событие»?

В этом другом коде за страницей я добавляю столбец в мой gridview.

//Add a colum check row 
    SubjectlistTable.Columns.Add("Check", Type.GetType("System.Boolean")); 

    Session["ValidateSubject"] = SubjectlistTable; 

    Response.Redirect("ValidateSubjectTeacher.aspx"); 

В ValidateSubjectTeacherPage:

Это программа Aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ValidateSubjectTeacher.aspx.cs" Inherits="SoftwareAnalysisAndDesign.SAD.ValidateSubjectTeacher" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Student Assessment Form</title> 
    <meta charset="utf-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1"/> 
    <link rel="stylesheet" href="Bootstrap/css/bootstrap-theme.css" /> 
    <link rel="stylesheet" href="Bootstrap/css/bootstrap.min.css"/> 
    <link rel="stylesheet" type="text/css" href="Stylesheets/ValidateSubjectTeacherStyle.css"/> 

    <!--Side bar link--> 
    <link rel="stylesheet" href="SidebarBootstrap/css/bootstrap.min.css" /> 
    <link rel="stylesheet" href="SidebarBootstrap/css/simple-sidebar.css" /> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div class="headerwrapper"> 
      <div id="headercontent" class="jumbotron"> 
       <img id="img1" src="usjrlogo.png" /> 
       <h1 id="title">Online AppSess System</h1> 
      </div> 
     </div> 

     <div class="container" style="text-align: center; margin: 0 auto;"> 
      <br /> 
      <h1>Validation of Subjects</h1> 
      <br /> 
      <asp:GridView runat="server" CssClass="table table-hover table-bordered" ID="ValidateSubject" Style="text-align: center"></asp:GridView> 
     </div> 

     <div style="float: right; padding-right: 75px;"> 
      <button type="button" runat="server" class="btn btn-primary" onserverclick="ValidateSubject_Click">Validate</button> 
      <button type="button" runat="server" class="btn btn-success" onserverclick="GoBackTeacher_Click">Go Back</button> 
     </div> 
    </form> 

    <script src="jquery/jquery.min.js"></script> 
    <script src="Bootstrap/js/bootstrap.min.js"></script> 
</body> 
</html> 

Aspx Код За:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
using System.Data; 

namespace SoftwareAnalysisAndDesign.SAD 
{ 
    public partial class ValidateSubjectTeacher : System.Web.UI.Page 
    { 
     CheckBox check = new CheckBox(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (Session["ValidateSubject"] == null) 
      { 
       Response.Redirect("TeacherPage.aspx", true); 
      } 

      if (!IsPostBack) 
      { 
       ValidateSubject.DataSource = Session["ValidateSubject"]; 
       ValidateSubject.DataBind(); 
      } 
      //Add a checkbox in the last row of GridView Progmatically 
      foreach (GridViewRow row in ValidateSubject.Rows) 
      { 
       check = row.Cells[row.Cells.Count - 1].Controls[0] as CheckBox; //position Check column on last row in gridview 
       check.Enabled = true; 
       check.CheckedChanged += ValidateSubject_Click; //Bind the event on the button 
       check.AutoPostBack = true; //Set the AutoPostBack property to true 
      } 
     } 
     protected void ValidateSubject_Click(object sender, EventArgs e) 
     { 
      CheckBox chk = (CheckBox)sender; 
      GridViewRow grvRow = (GridViewRow)chk.NamingContainer;//This will give row 


      string validated = "Validated"; 
      string notyetvalidated = "Not yet validated"; 
      string studid = grvRow.Cells[0].Text; 
      string coursenum = grvRow.Cells[1].Text; 

      if (chk.Checked) 
      { 
       grvRow.Cells[10].Text = validated; 
       //Open Connection 
       using (SqlConnection conn = new SqlConnection("Data Source=Keith;Initial Catalog=SAD;Integrated Security=True")) 
       { 
        //Open Connection to database 
        try 
        { 
         conn.Open(); 
        } 
        catch (Exception E) 
        { 
         Console.WriteLine(E.ToString()); 
        } 

        using (SqlCommand cmd = new SqlCommand("Update AssessmentForm set Status = @Validated where StudentID = @studentID and CourseNo = @Coursenumber" ,conn)) 
        { 
         cmd.Parameters.AddWithValue("@Validated", validated); 
         cmd.Parameters.AddWithValue("@studentID", studid); 
         cmd.Parameters.AddWithValue("@Coursenumber", coursenum); 
         cmd.ExecuteNonQuery(); 
        } 

        //Close Connection to database 
        try 
        { 
         conn.Close(); 
        } 
        catch (Exception E) 
        { 
         Console.WriteLine(E.ToString()); 
        } 
       } 

      } 
      else 
      { 
       grvRow.Cells[10].Text = notyetvalidated; 
      } 
     } 
     protected void GoBackTeacher_Click(object sender, EventArgs e) 
     { 
      Response.Redirect("TeacherPage.aspx"); 
     } 
    } 
} 

код работает, но когда я нажимаю отправить , система предложит мне ошибку, и я не могу обновить мою базу данных:

сообщение

Ошибка:

Исключение типа «System.InvalidCastException» произошло в SoftwareAnalysisAndDesign.dll, но не был обработан в пользовательском коде Дополнительная информация: Не удается привести объект типа «System.Web .UI.HtmlControls.HtmlButton ', чтобы ввести ' System.Web.UI.WebControls.CheckBox '.

Там что-то случилось с моим CheckBox событие здесь:

CheckBox chk = (CheckBox)sender; 

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

Связанные ссылка Get specific data and update database

+0

Почему вы не проверяете 'sender.GetType()' перед тем, как попытаться передать его чему-то, что это не так? – TZHX

+0

Установите точку останова и убедитесь, что на самом деле «отправитель». – PoweredByOrange

ответ

1

При нажатии на кнопки, «событие» вы обращаетесь не приходит из CheckBox в вашем GridView. Он исходит от вашего элемента <button>.

Способ, которым ваше приложение архивировано, кажется, что вам не нужно кнопки - при каждом нажатии на флажок, чтобы выбрать или отменить выбор, он выполнит действие в этой единственной строке данных. Поэтому непонятно, что вы хотите, когда нажата кнопка.

Вы могли бы служить оба эти события в том же методе, если вы хотели бы, по в начале этого делать что-то вроде:

protected void ValidateSubject_Click(object sender, EventArgs e) { 
    if (sender.GetType().FullName == "System.Web.UI.WebControls.CheckBox") { 
     // Have what you currently have for checkboxes here 
    } else if (sender.GetType().FullName == "System.Web.UI.HtmlControls.HtmlButton") { 
     // Do something else for the button, probably involving getting the GridView's rows and iterating through them 
    } 
} 

Но я предложил бы иметь отдельные обработчики событий для отдельных событий.

+0

Я не понял, когда я нажму на флажок, он уже обновит статус моего gridview, я думаю, нет необходимости в кнопке события. Спасибо вам за совет. –

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