es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mostrar Json en un Gridview dentro de otro Gridview.

Tengo un Json, como la imagen debajo:

Quiero mostrar “majors” en un gridview dentro de un gridview

XAML:

<GridView x:Name="asesmenGridView">
<GridView.ItemTemplate>
<DataTemplate>
<Grid x:Name="asesmenGrid">
<TextBlock
x:Name="judulT"
Text="{Binding Title}"/>
<GridView
x:Name="majorGridView"
ItemsSource="{Binding DataContext.majordatasource, ElementName=asesmenGridView}">
<GridView.ItemTemplate>
<DataTemplate x:DataType="local:MajorClass">
<Grid>
<TextBlock
x:Name="kelasT"
Text="{x:Bind Major}" />
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>

Código:
 
public MainPage()
{
this.InitializeComponent();
this.DataContext = this;
}
public List<MajorClass> majordatasource { get; set; } = new List<MajorClass>();
string urlPath = "https://…/choose-exam/2";
var httpClient = new HttpClient(new HttpClientHandler());
httpClient.DefaultRequestHeaders.Add("Authorization",
string.Format("Bearer {0}", tkn));
var response = await httpClient.GetAsync(urlPath);
string jsonText = await response.Content.ReadAsStringAsync();
try
{
JsonArray jsonArray = JsonArray.Parse(jsonText);
foreach (JsonValue groupValue in jsonArray)
{
string title = groupObject["title"].GetString();
JsonArray majorArray = groupObject["majors"].GetArray();
MajorClass majorC = new MajorClass();
foreach (JsonValue majorValue in majorArray)
{
JsonObject majorObject = majorValue.GetObject();
double majorID = majorObject["major_id"].GetNumber();
string major = majorObject["major"].GetString();

                                            majorC.MajorID = (int)majorID;
                                            majorC.Major = major + &quot;,&quot;;
                                            majordatasource.Add(majorC);
                                        }

Ujian ujian = new Ujian();
ujian.Title = title;
ujiandatasource.Add(ujian);
}
asesmenGridView.ItemsSource = ujiandatasource;

Clase Ujian:

public class Ujian
{
public string Title { get; set; }
public ObservableCollection<MajorClass> majordatasource { get; set; }

    public Ujian()
    {
        Title = string.Empty;
        majordatasource = new ObservableCollection&lt;MajorClass&gt;();
    }

    public Ujian(string title)
    {
        Title = title;
    }
}

public class MajorClass
{
    public int MajorID { get; set; }
    public string Major { get; set; }
}

}

Desde el código anterior, no logré mostrarlo en el gridview en un gridview (los datos que se recuperan son solo los últimos datos y se muestran repetitivamente, como se muestra a continuación).

¿Cómo manejarlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para mostrar las “carreras” en un Gridview dentro de otro Gridview

    Para mostrar las “carreras” en un Gridview dentro de otro Gridview, necesitamos actualizar el código de la siguiente manera:

    1. Elimine estas líneas de código:
    public List<majorclass> majordatasource { get; set; } = new List<majorclass>();
    
    1. Modifique el código en el bucle que analiza los datos JSON de la siguiente manera:
    foreach (JsonValue groupValue in jsonArray)
    {
        string title = groupValue.GetObject()["title"].GetString();
        Ujian ujian = new Ujian();
        ujian.Title = title;
    
        // crear una nueva colección para almacenar las carreras para cada examen
        var majordatasource = new ObservableCollection<majorclass>();
    
        JsonArray majorArray = groupValue.GetObject()["majors"].GetArray();
        foreach (JsonValue majorValue in majorArray)
        {
            JsonObject majorObject = majorValue.GetObject();
            double majorID = majorObject["major_id"].GetNumber();
            string major = majorObject["major"].GetString();
    
            majordatasource.Add(new MajorClass() { MajorID = (int)majorID, Major = major });
        }
    
        ujian.majordatasource = majordatasource;
        ujiandatasource.Add(ujian);
    }
    // establecer el ItemsSource para el Gridview en la colección ujiandatasource
    asesmenGridView.ItemsSource = ujiandatasource;
    

    Explicación:

    • Estamos creando una nueva ObservableCollection<majorclass> para cada examen en los datos JSON. Esto nos permite mostrar las “carreras” para cada examen por separado en el Gridview dentro del Gridview.
    • Para cada examen, creamos una nueva instancia de la clase Ujian y establecemos su propiedad Title.
    • Luego, estamos llenando la colección majordatasource para cada examen analizando la matriz “majors” en los datos JSON y agregando cada objeto MajorClass a la colección.
    • Finalmente, estamos estableciendo la propiedad majordatasource del objeto Ujian en la nueva ObservableCollection<majorclass> que creamos y agregando el objeto Ujian a la colección ujiandatasource. Esta colección contiene todos los exámenes con sus “carreras” asociadas.
    • Establecemos la propiedad ItemsSource del Gridview exterior en la colección ujiandatasource, que mostrará todos los exámenes en el Gridview exterior.
    • Usamos la propiedad ItemsSource del Gridview interior para enlazar con la propiedad majordatasource del objeto Ujian, que mostrará las “carreras” de cada examen en el Gridview interior.

    Con estos cambios, las “carreras” deberían mostrarse correctamente en el Gridview dentro del Gridview, como se muestra a continuación:

    </majorclass></majorclass></majorclass></majorclass>”>Comments are closed.