Фильтрация данных в представлении данных, ограниченном из DataSet - PullRequest
0 голосов
/ 15 октября 2018

Я ограничил данные для datagridview из DataSet, и я пытаюсь отфильтровать эти ограниченные данные в datagridview при событии textchange У меня возникли две проблемы, когда

  1. Я начинаю печатать, он работает нормально, за исключением того, что он удаляет пользовательские datagridview заголовки и задает имя столбца запроса ex.Заголовок - «Имя», его заменили на «NAM», то есть имя столбца в базе данных ...

  2. Вторая проблема, когда я вошел в другую часть, он не будет переопределен и выбрасываетИсключение, что я пропустил?

    public DataSet GetPatientList()
    {
        string connStr = ConfigurationManager.ConnectionStrings["SRJDconnstr"].ToString();
        string cmdStr = @"SELECT ROW_NUMBER()OVER(ORDER BY ID) AS SEQ,
                                                 ID,
                                                 DocNUM,
                                                 NAM,
                                                 FNAME,
                                                 LFNAME,
                                                 PHONE,
                                                 MOBILE,
                                                 SEX,
                                                 BIRTHDAY,
                                                 ADDRESS,
                                                 ENDATETIME
                                            FROM SICK
                                     ORDER BY ENDATETIME ASC;";
    
        SqlConnection conn = new SqlConnection(connStr);
        using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
        {
                conn.Open();
                cmd.CommandText = cmdStr;
                cmd.CommandType = CommandType.Text;
    
                ds = new DataSet();
                da = new SqlDataAdapter(cmd);
    
                da.Fill(ds, "PatientList");
    
                DGV_PatientList.Columns["DGV_PatientList_RowNum"].DataPropertyName = ds.Tables["PatientList"].Columns["SEQ"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_PatientID"].DataPropertyName = ds.Tables["PatientList"].Columns["ID"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_DocNUM"].DataPropertyName = ds.Tables["PatientList"].Columns["DocNUM"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_FirstName"].DataPropertyName = ds.Tables["PatientList"].Columns["NAM"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_FatherName"].DataPropertyName = ds.Tables["PatientList"].Columns["FNAME"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_LastName"].DataPropertyName = ds.Tables["PatientList"].Columns["LFNAME"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Phone"].DataPropertyName = ds.Tables["PatientList"].Columns["PHONE"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Mobile"].DataPropertyName = ds.Tables["PatientList"].Columns["MOBILE"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Gender"].DataPropertyName = ds.Tables["PatientList"].Columns["SEX"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Birthday"].DataPropertyName = ds.Tables["PatientList"].Columns["BIRTHDAY"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Address"].DataPropertyName = ds.Tables["PatientList"].Columns["ADDRESS"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_EntryDate"].DataPropertyName = ds.Tables["PatientList"].Columns["ENDATETIME"].ColumnName;
    
                return ds;
        }
    }
    

Событие изменения текста

    private void TB_FirstName_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrWhiteSpace(TB_FirstName.Text))
        {
            // first try below
            (ds.Tables["PatientList"] as DataTable).DefaultView.RowFilter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
            // second try below
            //ds.Tables["PatientList"].DefaultView.RowFilter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
        }
        else
        {
            DGV_PatientList.DataSource = GetPatientList();
            DGV_PatientList.DataSource = ds.Tables["PatientList"].DefaultView;
        }
    }

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Работа с DataGridView, привязанным к набору данных, не должна быть такой сложной - вы, должно быть, следовали действительно старому или плохо написанному учебнику

Способ, которым все это должно висеть вместе, гораздо болееаккуратно и компактно:

//in your code that handles loading the grid with data, e.g. in a Load button handler

  patientListTableAdapter.Fill(ds.PatientList); //strongly typed dataset, table is already bound to grid in design time. 
//Visual Studio binds it fully for you when you add it to the form, in the designer
//you never again mess with the bindings, just fill and empty the table: MVC


private void TB_FirstName_TextChanged(object sender, EventArgs e){

  if(string.IsNullOrWhiteSpace(TB_FirstName.Text)
    patientListBindingSource.Filter = null;
  else
    patientListBindingSource.Filter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
}

Да ... всего 5 строк кода должны делать все, что вы пытаетесь достичь здесь.Прямо сейчас вы используете эти технологии неправильно и достигаете трудного и неэффективного результата.

Инструкции по использованию таблиц данных см. В MSDN: https://msdn.microsoft.com/en-us/library/fxsa23t6.aspx

Начните с пошагового руководства «Создание простого приложения данных», создайте новый проект, выполните следующие действия.и создайте новый пример приложения.После того, как вы это сделаете, я рекомендую вернуться к существующему приложению и НЕ предпринимать попыток спасти то, что уже было сделано - удалить партию, удалить сетку данных из формы, создать новый типизированный набор данных, связать его с вашей БД,добавьте в форму новое правильно связанное представление данных, и дизайнер все настроит.Тогда все, что вам нужно сделать, это выбрать подходящее место для загрузки данных и применить обработчик с измененным текстом (5 строк кода, которые я поместил выше)

Я знаю, что это будет сложно, отбросив все этокод, в который вы пролили кровь и слезы ... но это всегда будет головной болью и никогда не будет работать правильно, потому что это совершенно неверный способ работы с данными и связанными элементами управления

0 голосов
/ 15 октября 2018

Установите для AutoGenerateColumns значение false.

Именно поэтому имена меняются, а также почему вы получаете исключение.Столбцы больше не существуют, и вы ссылаетесь на них по имени.

...