2017-10-24 7 views
1

의 DataRowView comboBox.SelectedValue의 실제 값을 가져 오는 대신 DataRowView 항목을 얻으므로 응용 프로그램을 실행할 때마다 오류가 발생합니다.값 대신

는 여기에 내가 오류를 받고 있어요 어디 코드입니다 : 내가 DataSource, DisplayMember 및 (ValueMember -> idC)를 설정하기 때문에

private void InitDataGridView() 
{ 
    query = "SELECT p.name, p.age FROM Person p INNER JOIN Class c ON p.idC=c.idC WHERE p.id=" 
      + comboBoxClass.SelectedValue; 
    command = new SqlCommand(query, connection); 
    adapter = new SqlDataAdapter(command); 
    datatable = new DataTable(); 
    adapter.Fill(datatable); 
    dataGridViewStudents.DataSource = datatable; 
} 

comboBoxClass.SelectedValue 나에게 "idC"를 반환해야합니다.

idC이 기본 키 (int)입니다.

ComboBox 설정 :

comboBoxClass.DataSource = datatable; 
comboBoxClass.DisplayMember = "className"; 
comboBoxClass.ValueMember = "idC"; 
+0

당신은 SQL 주입력이 있습니다. – SLaks

+0

'ComboBox'를 어떻게 설정했는지 보여줄 수 있습니까? –

+1

그래! 'comboBoxClass.DataSource = datatable; comboBoxClass.DisplayMember = "className"; comboBoxClass.ValueMember = "idC"; ' –

답변

0

좋아요, 내 코드에서 무엇이 잘못되었는지 알아 냈습니다. comboBox 초기화도 아니고 dataGridView '도 아니었지만 잘못된 쿼리를 작성하는 것은 내 잘못이었습니다.

나를 도우려는 노력에 감사드립니다.

+0

어떤 쿼리입니까? 어떤 제어를 제어하는 ​​쿼리? 쿼리가 잘못되어 쿼리를 사용하여 컨트롤을 초기화하면 초기화가 잘못되었다고 생각하지 않습니까? 어느 쪽이든, 기꺼이 고치 셨습니다. –

+0

네, 당신 말이 맞아요. 이 질의는 classID와 className을 얻는 간단한 선택입니다. 그렇습니다. 그것은 초기화입니다. –

0

바인딩, 또는 부적절하게 당신이 설명하는 정확한 효과를 가질 수 ValueMember 바인딩하지 않습니다. 아래에서 볼 수 있듯이 스 니펫.

ComboBox의 초기화에 몇 가지 중단 점을 넣고 ValueMember가 필요한 것이 아닌 이유를 파악하십시오. 그런 다음 DataGridView가 올바르게 채워 져야합니다.

using System; 
using System.Data; 
using System.Drawing; 
using System.Windows.Forms; 

namespace BindingToDataTable_46914296 
{ 


    public partial class Form1 : Form 
    { 
     ComboBox combob = new ComboBox(); 
     ComboBox combobFail = new ComboBox(); 
     TextBox txtbx = new TextBox(); 
     public Form1() 
     { 
      InitializeComponent(); 
      InitComboBox(); 
      InitComboBoxFail(); 
      InitTxtBx(); 
     } 

     private void InitTxtBx() 
     { 
      txtbx.Location = new Point(5, 30); 
      txtbx.Width = this.Width - 10; 
      this.Controls.Add(txtbx); 
     } 

     /// <summary> 
     /// This version works, the proper selected value shows up in the textbox 
     /// </summary> 
     private void InitComboBox() 
     { 
      combob.Location = new Point(5,5); 
      this.Controls.Add(combob); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add(new DataColumn("Col1", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col2", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col3", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col4", typeof(Int32))); 
      dt.Rows.Add("blah1", "bleh", "bloh", 1); 
      dt.Rows.Add("blah2", "bleh", "bloh", 2); 
      dt.Rows.Add("blah3", "bleh", "bloh", 3); 
      dt.Rows.Add("blah4", "bleh", "bloh", 4); 
      combob.DataSource = dt; 
      combob.DisplayMember = "Col1"; 
      combob.ValueMember = "Col4"; 

      combob.SelectedValueChanged += Combob_SelectedValueChanged; 
     } 


     /// <summary> 
     /// This version DOES NOT work, a DataRowView item appears in the textbox when the selection changes 
     /// </summary> 
     private void InitComboBoxFail() 
     { 
      combobFail.Location = new Point(combob.Location.X + combob.Width + 5, 5); 
      this.Controls.Add(combobFail); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add(new DataColumn("Col1", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col2", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col3", typeof(string))); 
      dt.Columns.Add(new DataColumn("Col4", typeof(Int32))); 
      dt.Rows.Add("blah1", "bleh", "bloh", 1); 
      dt.Rows.Add("blah2", "bleh", "bloh", 2); 
      dt.Rows.Add("blah3", "bleh", "bloh", 3); 
      dt.Rows.Add("blah4", "bleh", "bloh", 4); 
      combobFail.DataSource = dt; 
      combobFail.DisplayMember = "Col1"; 
      //only difference is I am not binding ValueMember 

      combobFail.SelectedValueChanged += Combob_SelectedValueChanged; 
     } 

     private void Combob_SelectedValueChanged(object sender, EventArgs e) 
     { 
      txtbx.Text = ((ComboBox)sender).SelectedValue.ToString(); 
     } 
    } 
}