Привязка результатов поиска к сетке данных - PullRequest
1 голос
/ 29 мая 2010

Я хочу добавить функцию поиска в мою программу. Есть класс, который имеет эту функцию:

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

        }

Существуют свойства установки и получения для mField и mValue. DM - это объект класса DataManagement, который имеет метод GetData:

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;
    }

Это не работает. Я не знаю почему. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 29 мая 2010

Добавьте оператор DataBind() в свой метод RefreshGrid(), чтобы новые результаты действительно отображались в таблице.

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

Также рассмотрите возможность изменения вашего другого метода:

  1. Ваш специальный SQL имеет уязвимость внедрения SQL . Останови все, пока не исправишь!
  2. btnfind_Click не нужно заканчивать тем, что звонит cust.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 голосов
/ 30 мая 2010

Ваш RefreshGrid метод перезаписывает DataSource, установленный в btnfind_Click ... не вызывайте его, просто вызовите DataBind

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

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

}

Кстати, вам не нужно назначать новый DataTable для dt, если вы сразу устанавливаете его на результат cust.Search ... вы просто создаете экземпляр даром (я исправил это в коде выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...