Создать таблицу из нескольких списков

Рейтинг: 0Ответов: 2Опубликовано: 14.03.2023

Сергей может видеть работы нескольких гаражей, вначале он идентифицируется, ему выходит лист ВСЕХ гаражей ему доступных, затем Сергей выбирает из списка гаражи, которые ему нужны прямо сейчас, все это происходит на странице1 для выбора в списке я использую Syncfusion

<SfMultiSelect TValue="string[]" TItem="GarajModel" Placeholder=@myLocalizerTrad["ChoiceGaraj"] DataSource="@garajsList" @bind-Value="@MultiVal" Mode="VisualMode.Box">
    <MultiSelectFieldSettings Text="NameGaraje" Value="CodeGaraj" />
    <MultiSelectEvents TItem="GarajModel" TValue="string[]" OnValueSelect="OnSelect" OnValueRemove="OnDeselect" ValueChange="@OnSelectValue" />
</SfMultiSelect>

класс Модель

public class GarajModel
{
    public string NameGaraje {get; set;}
    public string CodeGaraj {get; set;}
}

когда Сергей выбирает из списка гараж1 и гараж2 он "идентифитируется" второй раз и переходит на страницу2 где таблица показывает ему "работы" тех гаражей что он выбрал.

таблица на второй странице

<SfGrid @ref="Grid" DataSource="@tablicaPoKotoroyDelayuBindingPokaza" Height="auto">
    </GridFilterSettings>

    <GridColumns>
        <GridColumn ......
       
        </GridColumn>
    </GridColumns>
</SfGrid>

передаю данные этой таблице через событие

IEnumerable<ModelRabotiGaraja> tablicaVremennaya;
IEnumerable<ModelRabotiGaraja> tablicaPoKotoroyDelayuBindingPokaza;


private async Task GetRabotiGarajey()
{
    tablicaPoKotoroyDelayuBindingPokaza = null; //иначе прибавляет потом строки
    tablicaVremennaya = null; //то же самое

    foreach (var garaje in SpisokGarajey)
    {
        if (!string.IsNullOrEmpty(garaj.code1) && !string.IsNullOrEmpty(garaj.code2))
            try
            {
                tablicaVremennaya = await garajService.GetGarajList(garaj.code1, garaj.code2);

                if (tablicaPoKotoroyDelayuBindingPokaza == null)
                {
                    tablicaPoKotoroyDelayuBindingPokaza = missionListsModelTemp.ToList();
                }
                else
                {
                    tablicaPoKotoroyDelayuBindingPokaza = 
                tablicaPoKotoroyDelayuBindingPokaza.Concat(tablicaVremennaya); 
//то есть первый гараж в таблице уже есть и я добавляю строки второго гаража с помощью Concat                                   
                }
            }
            catch (Exception e)
            {
                string msg = e.Message;
            }
    }

    this.StateHasChanged();
}

КАК НАПИСАТЬ ГРАММОТНО ДАННЫЙ КОД

(подправить логику события GetRabotiGarajey), чтоб в дальнейшем не думать о нагрузке программы и возможных оплошностях ?

***хотелось бы получить ответа пожалуйста обратите внимание на этот вопрос🦄

Ответы

▲ 1

я использовала Concat и немного изменила метод, в итоге моя таблица показывает верные данные.

IEnumerable<ModelRabotiGaraja> tablicaVremennaya;
IEnumerable<ModelRabotiGaraja> tablicaPoKotoroyDelayuBindingPokaza;


private async Task GetRabotiGarajey()
{
    tablicaPoKotoroyDelayuBindingPokaza = null; //иначе прибавляет потом строки
    tablicaVremennaya = null; //то же самое

    foreach (var garaje in SpisokGarajey)
    {
        if (!string.IsNullOrEmpty(garaj.code1) && !string.IsNullOrEmpty(garaj.code2))
            try
            {
                tablicaVremennaya = await garajService.GetGarajList(garaj.code1, garaj.code2);

                if (tablicaPoKotoroyDelayuBindingPokaza == null)
                {
                    tablicaPoKotoroyDelayuBindingPokaza = missionListsModelTemp.ToList();
                }
                else
                {
                    tablicaPoKotoroyDelayuBindingPokaza = 
                tablicaPoKotoroyDelayuBindingPokaza.Concat(tablicaVremennaya); 
//то есть первый гараж в таблице уже есть и я добавляю строки второго гаража с помощью Concat                                   
                }
            }
            catch (Exception e)
            {
                string msg = e.Message;
            }
    }

    this.StateHasChanged();
}
▲ 0

Для того чтобы правильно получить для пользователя все списки гаражей нужно использовать массив или коллекцию. До цикла вы указали tablicaVremennaya = null; а в самом цикле tablicaVremennaya = awaitgarajService.GetGarajList(garaj.code1, garaj.code2); то есть каждый проход цикла создает новый гараж. Используйте к примеру

     // Создаем коллекцию гаражей
var GarageTemp = new List<tablicaVremennaya>();
private async Task GetRabotiGarajey()
{   
    foreach (var garaj in SpisokGarajey)
    {
        if (!string.IsNullOrEmpty(garaj.code1) && !string.IsNullOrEmpty(garaj.code2))
                GarageTemp.Add(await garajService.GetGarajList(garaj.code1, garaj.code2)); 
    }
    tablicaPoKotoroyDelayuBindingPokaza = tablicaVremennaya;
    this.StateHasChanged();
}

В вашем ответе все работает за счёт условий, при втором проходе цикла все также создается таблица tablicaVremennaya, то есть в каждом новом повторении перезаписывается в памяти таблица и за счёт условий if else вы склеиваете данные, обращение к ним и их свойствам в этом случае не очень удобное так как по id будет не так просто получить то что надо, вам выдаст все два класса. Посмотрите мой пример. Если у вас разные таблицы tablicaVremennaya и tablicaPoKotoroyDelayuBindingPokaza. Вы можете создать промежуточную таблицу. И загружать данные в нее. И будет доступ к обоим классам без костылей