2013-11-14 3 views
1

Я пытаюсь обновить записи, используя C# ASP.NET. У меня есть следующие таблицы и текстовые поля. Процесс должен состоять в том, чтобы сначала найти EmployeeID. Введите EmployeeID на txtID и нажмите btnSearch. Текстовые поля будут заполнены тогда значениями EmployeeID = txtID.Text. txtLname, txtFname, и т.д. будет заполнен. Чтобы сохранить изменения, нажмите btnUpdate.не может обновить значение из dropdownbox

Но всякий раз, когда я пытаюсь щелкнуть на выпадающем списке, чтобы изменить отдел сотрудника, нет ошибки, но изменение не было сохранено. Кроме того, когда я пытаюсь изменить EmployeeID, он возвращает эту ошибку: Object reference not set to an instance of an object в этой строке dRow["EmployeeID"] = txtID.Text;.

EmployeeID и DeptID оба устанавливаются в качестве первичного ключа


enter image description hereenter image description here

Вот мой код btnSearch_Click()

 DataRow myRow = dsEmp.Tables["tblEmployee"].Rows.Find(int.Parse(txtID.Text)); 

     txtID.Text = myRow["EmployeeID"].ToString(); 
     txtLname.Text = myRow["Lname"].ToString(); 
     txtFname.Text = myRow["Fname"].ToString(); 
     txtMname.Text = myRow["Mname"].ToString(); 
     txtAddress.Text = myRow["Address"].ToString(); 
     txtEmail.Text = myRow["Email"].ToString(); 
     txtPhone.Text = myRow["Phone"].ToString(); 
     txtJobtitle.Text = myRow["Jobtitle"].ToString(); 
     txtSalary.Text = myRow["Salary"].ToString(); 
     drpDepartments.SelectedValue = myRow["DeptID"].ToString();` 

Вот мой код btnUpdate_click()

 cb = new SqlCommandBuilder(daEmp); 

     DataRow dRow = dsEmp.Tables["tblEmployee"].Rows.Find(int.Parse(txtID.Text)); 
     dRow["EmployeeID"] = txtID.Text; 
     dRow["DeptID"] = drpDepartments.SelectedValue; 
     dRow["Lname"] = txtLname.Text; 
     dRow["Fname"] = txtFname.Text; 
     dRow["Mname"] = txtMname.Text; 
     dRow["Address"] = txtAddress.Text; 
     dRow["Email"] = txtEmail.Text; 
     dRow["Phone"] = txtPhone.Text; 
     dRow["Jobtitle"] = txtJobtitle.Text; 
     dRow["Salary"] = txtSalary.Text; 

     daEmp.Update(dsEmp, "tblEmployee"); 
     dsEmp.Tables["tblEmployee"].AcceptChanges(); 

Вот код для Page_Load

  sConn = new SqlConnection(sStr); 
     daEmp = new SqlDataAdapter("SELECT * FROM tblEmployee", sConn); 
     daDep = new SqlDataAdapter("SELECT * FROM tblDepartment", sConn); 
     dsEmp = new DataSet(); 
     dsDep = new DataSet(); 

     daEmp.Fill(dsEmp, "tblEmployee"); 
     daDep.Fill(dsDep, "tblDepartment"); 

     dsEmp.Tables["tblEmployee"].PrimaryKey = new DataColumn[] { dsEmp.Tables["tblEmployee"].Columns["EmployeeID"] }; 

     drpDepartments.DataSource = dsDep.Tables["tblDepartment"]; 
     drpDepartments.DataTextField = "Description"; 
     drpDepartments.DataValueField = "DeptID"; 
     drpDepartments.DataBind(); 

Я просто не понимаю, почему это происходит. Пожалуйста, помогите мне, я новичок в ASP.NET. Благодарю.

+0

Пожалуйста, пост код для 'Page_Load' события. –

+0

@KarlAnderson Я добавил 'Page_Load' – user2971155

+0

Знаете ли вы, как отлаживать свой код в Visual Studio? –

ответ

1

Эта линия здесь проблема:

DataRow dRow = dsEmp.Tables["tblEmployee"].Rows.Find(int.Parse(txtID.Text)); 

Вопрос заключается в том, что Text свойства текстового поля с именем txtID пусто, поэтому разбор пустой строки не находит строку в базе данных и dRow - null. Таким образом, первая попытка использовать dRow на этой линии:

dRow["EmployeeID"] = txtID.Text; 

И Kaboom!

Моя рекомендация состоит в том, чтобы поставить пункт охраны прежде, чем вы даже попытаться найти строку в базе данных, например:

if(!String.IsNullOrEmpty(txtId.Text)) 
{ 
    // Yes, the text box has a value so try to look it up 
    DataRow dRow = dsEmp.Tables["tblEmployee"].Rows.Find(int.Parse(txtID.Text)); 

    // Is dRow null? 
    if(dRow != null) 
    { 
     dRow["EmployeeID"] = txtID.Text; 
     dRow["DeptID"] = drpDepartments.SelectedValue; 
     dRow["Lname"] = txtLname.Text; 
     dRow["Fname"] = txtFname.Text; 
     dRow["Mname"] = txtMname.Text; 
     dRow["Address"] = txtAddress.Text; 
     dRow["Email"] = txtEmail.Text; 
     dRow["Phone"] = txtPhone.Text; 
     dRow["Jobtitle"] = txtJobtitle.Text; 
     dRow["Salary"] = txtSalary.Text; 
    } 
} 
else 
{ 
    // Unable to find an empty string value in the database so don't even try 
    // You can display an error message maybe or throw an exception, etc. 
} 

UPDATE:

ваших отделов выпадающий не обновляется, потому что при загрузке каждой страницы (загрузка начальной страницы или пост-назад) код повторно привязывает выпадающее меню перед тем, как будет запущен код для его сохранения в базе данных. В ASP.NET WebForms Page_Load происходит до обработчика события щелчка (btnUpdate_click() в этом случае), поэтому вы удаляете выбор, сделанный пользователем, а затем пытаетесь выполнить сохранение.

В вашем Page_Load, попробуйте вместо этого:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     // Do not do these things on every post back to the server 
     sConn = new SqlConnection(sStr); 
     daEmp = new SqlDataAdapter("SELECT * FROM tblEmployee", sConn); 
     daDep = new SqlDataAdapter("SELECT * FROM tblDepartment", sConn); 
     dsEmp = new DataSet(); 
     dsDep = new DataSet(); 

     daEmp.Fill(dsEmp, "tblEmployee"); 
     daDep.Fill(dsDep, "tblDepartment"); 

     dsEmp.Tables["tblEmployee"].PrimaryKey = new DataColumn[] { dsEmp.Tables["tblEmployee"].Columns["EmployeeID"] }; 

     drpDepartments.DataSource = dsDep.Tables["tblDepartment"]; 
     drpDepartments.DataTextField = "Description"; 
     drpDepartments.DataValueField = "DeptID"; 
     drpDepartments.DataBind(); 
    } 
} 
+0

Спасибо, может быть, я должен просто отключить txtID, чтобы значение не могло быть изменено, так как EmployeeID является Первичным ключом. Как насчет выпадающего окна? Это не обновление. – user2971155

+0

Если я изменяю 'dRow [" DeptID "] = drpDepartments.SelectedValue;' to 'dRow [" DeptID "] = drpDepartments.DataValueField;' Я получаю эту ошибку 'Входная строка не в правильном формате. Не могу магазин в колонке DeptID. Ожидаемый тип - Int32.' – user2971155

+0

@ user2971155 - см. Обновленный ответ, чтобы поставить условную логику в событие 'Page_Load'. –

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