whateves Ответов: 2

Как мне собрать определенные строки вместе в datagridview?


Привет,

Я создал элемент управления DataGridView, чтобы перечислить несколько вещей. Однако я хочу собрать определенные строки вместе (а не помещать их все в строку) на основе условия из текстового поля. Например, когда я набираю "фрукты" в текстовом поле. Все ряды, содержащие определенный тип фруктов, будут автоматически выстраиваться друг на друге, начиная с первого ряда вот так:

1 груша
2 банана
3 апельсина
4 манго

То же самое относится и к остальным строкам, содержащим тип мяса, когда слово "мясо" вводится в текстовое поле.

Спасибо!

Что я уже пробовал:

DataTable table = new DataTable();

        private void Form1_Load(object sender, EventArgs e)
        {
            // populate dgv from datatable

            // add columns
            table.Columns.Add("Number", typeof(int));
            table.Columns.Add("Food", typeof(string));

            // add rows
            table.Rows.Add(1, "BBQ");
            table.Rows.Add(2, "Pear");
            table.Rows.Add(3, "Eggs");
            table.Rows.Add(4, "Banana");
            table.Rows.Add(5, "Noodle");
            table.Rows.Add(6, "Orange");
            table.Rows.Add(7, "Mango");
            table.Rows.Add(8, "Beef");

            dataGridView1.DataSource = table;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "Fruit" )
            {

            }
        }

BillWoodruff

До сих пор вы не предприняли никаких шагов к сортировке, изменению вида. В вашем столе нет ничего, что указывало бы вам, какие предметы являются фруктами.

2 Ответов

Рейтинг:
1

MadMyche

Что вам нужно, так это создать коллекция<тип>, который будет содержать все продукты питания, а также дополнительное свойство для типа пищи. В какой-то момент эта коллекция может быть заполнена базой данных.

public class Food {
  public int FoodID { get; set; }
  public string FoodTyoe { get; set; }
  public string FoodName { get; set; }

  public Food() {}
  public Food(int foodID, string foodType, string foodName) {
    FoodID = foodID;
    FoodType = foodType;
    FoodName = foodName;
  }

  public Collection<Food> LoadAllFood() {
    Collection<Food> foods = new Collection<Food>();

    foods.Add(new Food(1, "Meat", "BBQ"));
    foods.Add(new Food(2, "Fruit", "Pear"));
    // and so on with other items

    return foods;
  }
}
Так что теперь у вас есть все ваши продукты. Теперь тебе нужно это сделать фильтр это вниз по типу еды. Это легко достигается с помощью lambda выражение в вашем методе кнопки:
private void Button1_Click(object sender, EventArgs e) {
  table.Rows.Clear();

  // get all the foods
  Collection<Food> AllFoods = new Food().LoadAllFoods();

  // filtered
  Collection<Food> SomeFoods = AllFoods.Where(f => f.Type == textBox1.Text);

  // populate your table
  foreach(Food item in SomeFoods) {
     table.Rows.Add(item.FoodID, item.FoodName);
  }

  // refresh your DGV
  dataGridView1.Refresh();
}

Теперь это поспешно написано и могло бы быть намного компактнее и эффективнее. Я думал, что это даст вам начало в том, как использовать объектно-ориентированное программирование.


whateves

Спасибо за ваше предложение. Но что-то не так с лямбда-выражением в f.Type

MadMyche

Вероятно, его нужно установить как IEnumerable
var SomeFoods = ((IEnumerable)AllFoods).Where(....
Ты можешь заняться этим исследованием, а я пойду спать.

BillWoodruff

Я надеялся привлечь сюда оперативника, а не писать для него код.

BillWoodruff

мой голос № 3: "наспех написанный" да, и код, который не будет компилироваться. если вы собираетесь использовать (менее известную) коллекцию<T>, вы ожидаете увидеть некоторое использование ее защищенных переопределений методов. использование Collection<T> потребует от вас импорта системы.Коллекции.Пространство Имен ObjectModel.

whateves

Что? Нет, ты не должен. Я понял это с помощью Dataview.RowFilter. На самом деле это было легче понять.

BillWoodruff

см. решение, которое я опубликовал для кода. и я счастлив видеть слова "я понял это" :)

Рейтинг:
1

BillWoodruff

Как указывает Мадмич, вы должны включить данные категории в код.

Добавление еще одного столбца с данными категории является логичным выбором.

Предполагая, что вы добавили столбец с именем 'Category в качестве третьего столбца, вы можете отсортировать DataTable:

string cat = textBox1.Text;

table = table.AsEnumerable()
    .OrderByDescending(r => r.Field<string>(2).StringCaseIndependentEq(cat))
    .CopyToDataTable();

dataGridView1.DataSource = table;
dataGridView1.Refresh();
Этот код использует простой метод расширения сравнения строк, не зависящий от регистра:
public static class StringExtensions
{
    // see: [<a href="http://cc.davelozinski.com/c-sharp/fastest-way-to-compare-strings" target="_blank" title="New Window">^</a>] 
    public static bool StringCaseIndependentEq(this string s1, string s2)
    {
        return String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase) == 0;
    }
}