2016-12-05 6 views
2

enter image description hereЧто нужно сделать, чтобы свести к минимуму состояния, если еще на контрольной

У меня есть вид сетки, в которой весь вопрос был дисплей от доступа к базе данных. теперь я хочу выполнить операцию поиска в заданных текстовых полях, пользователь может ввести данные в текстовое поле или во все текстовые поля, в зависимости от потребностей пользователя. Мой вопрос - сколько раз условие давалось, чтобы любой пользователь предоставлял информацию в любом текстовом поле, фильтрация выполняется соответствующим образом.

для например: пользователь дал только стандартные и знаки, чем фильтрации должны быть эффективны там, где стандартный = «заданное значение» и знаки = «заданное значение» только

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

Мой код:

private void txt_marks_TextChanged(object sender, EventArgs e) 
     { 
      string marks = Convert.ToString(txt_marks.Text); 
      string q_type = Convert.ToString(cmbQType.SelectedValue); 
      if (q_type.Contains("[") || q_type.Contains("]") || q_type.Contains("*") || q_type.Contains("%")) 
      { 
       q_type = replacestring(q_type); 
      } 
      if (btnlanguage.Text != "" && txt_sub.Text != "" && txt_std.Text != "" && cmbQType.SelectedIndex != -1 && txt_marks.Text != "") 
      { 
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format("Subject Like '" + txt_sub.Text.ToString() + "%' and Standard Like '" + txt_std.Text.ToString() + "'and Chapter Like '" + btnlanguage.Text.ToString() + "%' and QuestionType Like '" + q_type + "' and Marks = '" + marks + "'"); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 
      else if (txt_marks.Text != "" && cmbQType.SelectedIndex != -1 && txt_sub.Text != "" && txt_std.Text != "") 
      { 
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format("QuestionType Like '" + q_type + "' and Marks = '" + marks + "' and Subject Like '" + txt_sub.Text.ToString() + "%' and Standard Like '"+ txt_std.Text.ToString()+ "'"); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 

      else if (txt_marks.Text != "" && cmbQType.SelectedIndex != -1 && txt_sub.Text != "") 
      { 
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format("QuestionType Like '" + q_type + "' and Marks = '" + marks + "' and Subject Like '" + txt_sub.Text.ToString() + "%'"); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 
      else if (txt_marks.Text != "" && cmbQType.SelectedIndex != -1) 
      { 
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format(" QuestionType Like '" + q_type + "' and Marks = '" + marks + "'"); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 
      else if (txt_marks.Text != "") 
      { 
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format("Marks = '"+ marks +"'"); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 
      else 
      { 
       load_grid_view(); 
      } 

Аналогично выше кодирование было сделано для каждого данного элемента управления.

спасибо.

+0

Иисус Христос, который, конечно, какой-то код. На стороне примечания, если вы делаете это 'string marks = Convert.ToString (txt_marks.Text);', почему вы все еще используете 'txt_marks' повсюду? –

+0

Поскольку комбинация txt_Marks с различными элементами управления дает другое условие, предположим, что пользователь может присвоить значение значению стандартных значений, но не субъект, иначе пользователь может дать значение объекта, но не стандартное значение. Я написал все возможное условие, 5 факториальных условий, но хочет минимизировать все. – Mamta

ответ

1

Спасибо @KMoussa и @Sid. С вашим объединением Оба предложения Я сделал динамический запрос в функции и вызываю эту функцию на каждом элементе управления, а также хотел бы поделиться с этим сайтом.

Моя функция:

public void searching_query() 
     { 
      string grid_query = ""; 
      int cnt_coma = 0; 
      string q_type = ""; 
      if (txt_marks.Text != "") 
      { 
       string marks = Convert.ToString(txt_marks.Text); 
      } 
      if (cmbQType.SelectedIndex != -1) 
      { 
       q_type = Convert.ToString(cmbQType.SelectedValue); 
       // Removing the wild character in question type . 
       if (q_type.Contains("[") || q_type.Contains("]") || q_type.Contains("*") || q_type.Contains("%")) 
       { 
        q_type = replacestring(q_type); 
       } 
      } 
      // counting the number of fields has been enter ->(for entering "and" in between in query) 
      { 
       if (txt_std.Text != "") 
        cnt_coma = 1; 
       if (txt_sub.Text != "") 
        cnt_coma = 2; 
       if (Txt_chp.Text != "") 
        cnt_coma = 3; 
       if (cmbQType.SelectedIndex != -1) 
        cnt_coma = 4; 
       if (txt_marks.Text != "") 
        cnt_coma = 5; 
      } 
      // making query for searching . 

      if (txt_std.Text != "") 
      { 
       if (cnt_coma > 1) 
        grid_query = grid_query + "Standard Like '" + txt_std.Text.ToString() + "' and "; 
       else if (cnt_coma <= 1) 
        grid_query = grid_query + "Standard Like '" + txt_std.Text.ToString() + "'"; 
      } 
      if (txt_sub.Text != "") 
      { 
       if (cnt_coma > 2) 
        grid_query = grid_query + "Subject Like '" + txt_sub.Text.ToString() + "%' and "; 
       else if (cnt_coma <= 2) 
        grid_query = grid_query + "Subject Like '" + txt_sub.Text.ToString() + "%' "; 
      } 
      if (Txt_chp.Text != "") 
      { 
       if (cnt_coma > 3) 
        grid_query = grid_query + "Chapter Like '" + Txt_chp.Text.ToString() + "%' and "; 
       else if (cnt_coma <= 3) 
        grid_query = grid_query + "Chapter Like '" + Txt_chp.Text.ToString() + "%'"; 
      } 
      if (cmbQType.SelectedIndex != -1) 
      { 
       if (cnt_coma > 4) 
        grid_query = grid_query + "QuestionType Like '" + q_type + "' and "; 
       else if (cnt_coma <= 4) 
        grid_query = grid_query + "QuestionType Like '" + q_type + "'"; 
      } 
      if (txt_marks.Text != "") 
      { 
       grid_query = grid_query + "Marks = '" + Convert.ToString(txt_marks.Text) + "'"; 
      } 

      //---------- Grid view Filteration 
      if (cnt_coma > 0) 
      {    
       DataTable dt = main_ds.Tables[0]; 
       dt.DefaultView.RowFilter = String.Format(grid_query); 
       DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
      } 
      else 
      { 
       load_grid_view(); 
      } 

     } 
2

Как насчет использования некоторых Function, которые принимают n аргументов для выполнения некоторых проверок?

private void txt_marks_TextChanged(object sender, EventArgs e) 
{ 
    string marks = Convert.ToString(txt_marks.Text); 
    string q_type = Convert.ToString(cmbQType.SelectedValue); 
    char[] q_types = { '[', ']', '%'}; 

    if (ContainsChars(q_types, q_type)) 
    { 
     q_type = replacestring(q_type); 
    } 
    if (NoEmpty(btnlanguage.Text, txt_sub.Text, txt_std.Text, txt_marks.Text) && cmbQType.SelectedIndex != -1) 
    { 
     DataTable dt = main_ds.Tables[0]; 
     dt.DefaultView.RowFilter = String.Format("Subject Like '" + txt_sub.Text.ToString() + "%' and Standard Like '" + txt_std.Text.ToString() + "'and Chapter Like '" + btnlanguage.Text.ToString() + "%' and QuestionType Like '" + q_type + "' and Marks = '" + marks + "'"); 
     DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
    } 
    else if (NoEmpty(txt_marks.Text, txt_sub.Text, txt_std.Text) && cmbQType.SelectedIndex != -1) 
    { 
     DataTable dt = main_ds.Tables[0]; 
     dt.DefaultView.RowFilter = String.Format("QuestionType Like '" + q_type + "' and Marks = '" + marks + "' and Subject Like '" + txt_sub.Text.ToString() + "%' and Standard Like '"+ txt_std.Text.ToString()+ "'"); 
     DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
    } 

    else if (NoEmpty(txt_marks.Text, txt_sub.Text) && cmbQType.SelectedIndex != -1) 
    { 
     DataTable dt = main_ds.Tables[0]; 
     dt.DefaultView.RowFilter = String.Format("QuestionType Like '" + q_type + "' and Marks = '" + marks + "' and Subject Like '" + txt_sub.Text.ToString() + "%'"); 
     DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
    } 
    else if (txt_marks.Text != "" && cmbQType.SelectedIndex != -1) 
    { 
     DataTable dt = main_ds.Tables[0]; 
     dt.DefaultView.RowFilter = String.Format(" QuestionType Like '" + q_type + "' and Marks = '" + marks + "'"); 
     DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
    } 
    else if (txt_marks.Text != "") 
    { 
     DataTable dt = main_ds.Tables[0]; 
     dt.DefaultView.RowFilter = String.Format("Marks = '"+ marks +"'"); 
     DGV_View.DataSource = main_ds.Tables[0].DefaultView; 
    } 
    else 
    { 
     load_grid_view(); 
    } 
} 

public static bool NoEmpty(params string[] strings) 
{ 
    return strings.All(x => x != string.Empty); 
} 

public static bool ContainsChars(IEnumerable<char> chars, string toTest) 
{ 
    return chars.Any(x => toTest.Contains(x)); 
} 

Пожалуйста, обратите внимание, что я написал с notepad++, так что я не опечатки чеки, поэтому извините, если есть какая-либо опечатка

1

Возможно, вы можете сохранить запрос поля в Tag собственности каждого контроль (например txt_marks.Tag будет установлен "Marks ='{0}'"), то вы можете определить метод extensiom получить запрос от TextBox, а другой для выпадающего, что-то вроде:

internal static string GetQuery(this TextBox textBox) 
{ 
    if(string.IsNullOrEmpty(textBox.Text)) return string.Empty; 
    return string.Format(textBox.Tag.ToString(), textBox.Text) 
} 

internal static string GetQuery(this ComboBox cmbBox) 
{ 
    if(cmbBox.SelectedIndex == -1) return string.Empty; 
    return string.Format(cmbBox.Tag.ToString(), cmbBox.SelectedValue) 
} 

Тогда у ou может просто прокрутить элементы управления, позвоните по телефону GetQuery и сделайте a string.Join("and ", controlQueries.Where(q => !string.IsNullOrEmpty(q))