2015-10-16 5 views
1

поэтому я планирую создать телефонную книгу, когда я дважды щелкнул данные/ячейку в datagridview, появится вторая форма (подробная форма), которая покажет все остальные детали этого идентификатора и данные должны появляться в текстовом поле, но это не работает. так вот мой код. Спасибо!.Ошибка в привязке данных в winform C#

private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e) 
{ 

    int id; 
    id = dataGridView1.CurrentCell.RowIndex; 
    Details details = new Details(id); 
    details.Show(); 

} 

в детальной странице

public Details(int id) 
{ 
    InitializeComponent(); 
    int val = id; 
    GetRecords(val); 
} 

private void GetRecords(int n) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    int id = n; 
    cmd.Connection = cn; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "SELECT * FROM Employee WHERE EmployeeID ='" + id + "';"; 

    da = new SqlDataAdapter(); 
    da.SelectCommand = cmd; 

    ds = new DataSet(); 
    da.Fill(ds, "Employee"); 
} 

private void AddDataBinding() 
{ 
    txtLN.DataBindings.Add("Text", ds, "Employee.LastName"); 
    txtFN.DataBindings.Add("Text", ds, "Employee.FirstName"); 
    txtMN.DataBindings.Add("Text", ds, "Employee.MiddleName"); 
    txtAddress.DataBindings.Add("Text", ds, "Employee.Address"); 
    txtAge.DataBindings.Add("Text", ds, "Employee.Age"); 
    txtLN.DataBindings.Add("Text", ds, "Employee.LastName"); 
    txtPhone.DataBindings.Add("Text", ds, "Employee.Phone"); 
    txtMobile.DataBindings.Add("Text", ds, "Employee.Mobile"); 
    txtEmail.DataBindings.Add("Text", ds, "Employee.Email"); 
    dtBirthday.DataBindings.Add("Value", ds, "Employee.Birthday"); 
    cbType.DataBindings.Add("SelectedItem", ds, "Employee.Type"); 
    txtName.DataBindings.Add("Text", ds, "Employee.OtherName"); 
    txtOPhone.DataBindings.Add("Text", ds, "Employee.OtherPhone"); 
    txtOMobile.DataBindings.Add("Text", ds, "Employee.OtherMobile"); 
} 
+0

Вы никогда не называют 'AddDataBinding'. Лучше научитесь использовать параметры в своих sql-запросах, чтобы избежать внедрения sql. – LarsTech

+0

** - ** В вашем 'CellContentDoubleClick' вы передаете' RowIndex' вместо 'Id'. ** - ** В вашей подробной форме вы не назовете 'AddDataBinding' ** - ** Рассмотрите возможность использования параметризованных запросов. ** - ** Попробуйте использовать конструктор для выполнения такой привязки данных –

+0

, каков правильный синтаксис для передачи выбранного идентификатора сотрудника? спасибо – elowearth

ответ

2

1- Вы должны найти идентификатор вместо индекса строки. Вы должны знать, какой столбец индекса для идентификатора, например, если ваш идентификатор в первом столбце, вы можете использовать это:

var id = (int)dataGridView1.Rows[e.RowIndex].Cells[0].Value; 

2- Рассмотрим с помощью параметризованных запросов, как это:

cmd.CommandText = "SELECT * FROM Employee WHERE EmployeeID [email protected]"; 
cmd.Parameters.AddWithValue("@Id", id); 
//cmd.Parameters.Add("@Id", SqlDbType.Int).Value = id; 

3- Выполнение привязки данных так, что Ivan сказал и вызвать AddDataBinding

DataTable dt; 

private void GetRecords(int n) 
{ 
    //... 
    da.Fill(ds, "Employee"); 
    dt = ds.Tables["Employee"]; 
    AddDataBinding(); 
} 

private void AddDataBinding() 
{ 
    txtLN.DataBindings.Add("Text", dt, "LastName"); 
    txtFN.DataBindings.Add("Text", dt, "FirstName"); 
    // ... 
} 
+0

, если пользователь выбрал случайную строку? как я могу получить первичный ключ (id) этой выбранной строки? – elowearth

+0

@elowearth Как я уже сказал, вы можете использовать 'var id = (int) dataGridView1.Rows [e.RowIndex] .Cells [0] .Value;' и вместо 0 использовать индекс вашего столбца 'Id'. Обратите внимание на 'e.RowIndex', который указывает на строку, которую пользователь дважды нажал на нее. Вы должны поместить этот код в 'dataGridView1_CellContentDoubleClick', который вы написали. –

+0

@elowearth Кстати, здесь, в StackOverFlow, когда вы найдете ответ полезным, вы можете любезно нажать на галочку рядом с ответом, чтобы принять его. таким образом, это будет более полезно для других пользователей. Вы можете принять только один ответ, но когда вы приобретете репутацию, вы можете проголосовать столько ответов, сколько найдете, в том числе принятое, щелкнув стрелку вверх рядом с ответом. –

1

Во-первых, следующий код id = dataGridView1.CurrentCell.RowIndex; запахи, убедитесь, что вы действительно получаете emplyeee значение Id.

Во-вторых, привязки данных WinForms не поддерживают «путь» (например, «Employee.LastName»), как это делает WPF. Для того, чтобы достичь своей цели, вы должны связываться с DataTable вместо этого, как это:

DataTable dt; 

private void GetRecords(int n) 
{ 
    //... 
    da.Fill(ds, "Employee"); 
    dt = ds.Tables["Employee"]; 
} 

private void AddDataBinding() 
{ 
    txtLN.DataBindings.Add("Text", dt, "LastName"); 
    txtFN.DataBindings.Add("Text", dt, "FirstName"); 
    // ... 
} 
Смежные вопросы