2010-05-29 3 views
1

내 프로그램에 검색 기능을 추가하고 싶습니다. mFieldmValue에 대한 세터와 게터의 호텔을 고를 수 있습니다데이터 그리드에 검색 결과 묶기

public DataTable Search() 
     { 
      string SQL = "Select * from Customer where " + mField + " like '%" + mValue + "%'"; 
      DataTable dt = new DataTable(); 
      dt = dm.GetData(SQL); 
      return (dt); 

     } 

:이 기능을 가진 클래스가 있습니다.

public DataTable GetData(string SQL) 
    { 
     SqlCommand command = new SqlCommand(); 
     SqlDataAdapter dbAdapter = new SqlDataAdapter(); 
     DataTable DataTable = new DataTable(); 

     command.Connection = clsConnection.GetConnection(); 
     command.CommandText = SQL; 
     dbAdapter.SelectCommand = command; 
     dbAdapter.Fill(DataTable); 
     return (DataTable); 
    } 

검색 기능은 현재 다음과 같이 구현됩니다 :이 작동하지 않습니다

private void btnfind_Click(object sender, EventArgs e) 
    { 
     //cust is the object of class customer// 
     if (tbCustName.Text != "") 
     { 
      cust.Field="CustName"; 
      cust.Value = tbCustName.Text; 
     } 
     else if (tbAddress.Text != "") 
     { 
      cust.Value = tbAddress.Text; 
      cust.Field="Address"; 
     } 
     else if (tbEmail.Text != "") 
     { 
      cust.Value = tbEmail.Text; 
      cust.Field="Email"; 
     } 
     else if (tbCell.Text != "") 
     { 
      cust.Value = tbCell.Text; 
      cust.Field = "Cell"; 
     } 

     DataTable dt = new DataTable(); 
     dt = cust.Search(); 
     dgCustomer.DataSource = dt; 
     RefreshGrid(); 
    } 

    private void RefreshGrid() 
    { 
     DataTable dt = new DataTable(); 
     dt = cust.GetCustomers(); 
     dgCustomer.DataSource = dt; 
    } 

DM는 방법을 GetData을 가지고 클래스 DataManagement의 대상이다. 나는 이유를 모른다. 도와주세요.

답변

1

RefreshGrid() 메서드에 DataBind() 문을 추가하면 새 결과가 실제로 눈금에 표시됩니다.

private void RefreshGrid() 
{ 
    DataTable dt = cust.GetCustomers(); 
    dgCustomer.DataSource = dt; 
    dgCustomer.DataBind(); 
} 

뿐만 아니라 다른 방법을 수정하십시오 :

  1. 귀하의 임시 SQL은 SQL 주입 취약점 있습니다. 당신이 고칠 때까지 모든 것을 그만두십시오!
  2. btnfind_Clickcust.Search()을 두 번 호출 할 필요가 없습니다.

    private void btnfind_Click(object sender, EventArgs e) 
    { 
        //<snip> 
        // no need to do all this twice. 
        // DataTable dt = new DataTable(); 
        // dt = cust.Search(); 
        // dgCustomer.DataSource = dt; 
        RefreshGrid(); 
    
    } 
    
+0

하지만 이미 referesh grid입니까? : – Abid

+0

나는 이전의 refereshGrid 함수를 편집합니까, 아니면 새로운 함수를 만들 수 있습니까? – Abid

0

귀하의 RefreshGrid 방법은 DataSource 당신이 그것을 호출 단지 그런데 DataBind

private void btnfind_Click(object sender, EventArgs e) 
{ 
    ... 

    DataTable dt = cust.Search(); 
    dgCustomer.DataSource = dt; 
    dgCustomer.DataBind(); 

} 

를 호출하지 않습니다 ... btnfind_Click 설정, 당신은 할 필요가 없습니다 덮어 쓰기한다 즉시 cust.Search의 결과로 설정하는 경우 새로 DataTable을 dt에 할당하십시오 ... 방금 인스턴스를 만들지 않았습니다 (위 코드에서 수정했습니다)