WPF datagrid feltöltés

WPF datagrid feltöltés
2018-01-25T12:02:43+01:00
2018-01-26T22:12:38+01:00
2022-08-18T20:00:33+02:00
Vazulka#13
Sziasztok!

Datagrid feltöltés eredményeképpen csak csíkokat rajzol a képernyőre. Próbáltam már 
xaml :
 <DataGrid x:Name="dg1" 
AutoGenerateColumns="True"
Margin="0,172,0,0"
ItemsSource="{Binding}" >

+ DataContext=lista;

vagy binding nélkül  dg1.ItemsSource=lista;
Listának próbáltam int[], string[], List<string>, List<List<string>>, string[][], string[,] var fileReadFromCsv()
A lista file-ok mindig feltöltve voltak (breakpointtal csekkoltam) az eredmény annyi vonal egymás alatt amennyi sort kéne megjeleníteni.
Mi lehet a hiba?
Előre is köszönöm!
Mutasd a teljes hozzászólást!
Csatolt állomány
Így visszaolvasva valóban kicsit kuszának tűnik.
Megpróbálom tisztázni...
Szóval..Reméltem hogy lesz egy hasonló megoldás mint ahogy listboxot lehet feltölteni, és akkor a gridbox-hoz kapcsolódó további teendőimet egy már "bejáratott úton" tudom folytatni. Ez a rész a programban egy csv file bol olvas be adatokat, azokat megjeleníti mátrix szerkezetben. Az adatok termék id, név, ár, típus stb. Soronként egy termék. Ezekhez az adatokhoz szerettem volna hozzáférni. Leelenőrizni összevetni egy adatbázissal, törölni, módosítani. Majd pedig adatbázisba lementeni. 
Nos már az elején a megjelenítésnél elakadtam mert semmit nem tudtam megjeleníteni akár vektor (1D konténer) akár mátrix 2D konténert adtam meg akár datacontextként, akár itemsourcenak. Csak vonalakat kaptam, illetve a list<stringnél> kiírta a capacity és a count értékeket. Természetesen a vektor kísérletek csak próbák voltak, hogy hátha...
Amit kaptam WPF DataGrid Control nem volt rossz, és egy másik stackoverflow bejegyzésből összeollózva egész elfogadható megoldást hoztam létre. 

public class Shoes { public int Id { get; set; } public string Name { get; set; } public string SubName { get; set; } public string Colour1 { get; set; } public string Colour2 { get; set; } public string Colour3 { get; set; } public string Type { get; set; } public static List<Shoes> list = new List<Shoes>(); public static List<Shoes> ReadFile(string filepath) { string[] lines = File.ReadAllLines(filepath, Encoding.Default); var data = from l in lines.Skip(1) let split = l.Split(';') select new Shoes { Id = int.Parse(split[0]), Name = split[1], SubName = split[2] == "" ? null : split[2], Colour1 = split[3], Colour2 = split[4] == "" ? null : split[4], Colour3 = split[5] == "" ? null : split[5], Type = split[6], }; Shoes.list = data.ToList(); return Shoes.list; }
}

Majd a Main.xaml.cs-be

private void Start_Click(object sender, RoutedEventArgs e) { DataContext = Shoes.ReadFile(@"..\..\Csv\Test2.csv"); } private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { stackpChildren1.Children.Clear(); stackpChildren2.Children.Clear(); if (e.AddedCells.Count != 0) { for (int i = 0; i < e.AddedCells.Count; i++) { Label l1 = new Label(); l1.Name = "l" + i.ToString(); l1.Content = e.AddedCells
.Column.Header.ToString(); l1.Margin = new Thickness(5, 0, 0, 0); l1.Height = 35; l1.Width = 385; l1.HorizontalAlignment = HorizontalAlignment.Left; l1.VerticalAlignment = VerticalAlignment.Top; l1.FontSize = 20; l1.FontFamily = new FontFamily("Trebuchet MS"); l1.FontWeight = FontWeights.DemiBold; stackpChildren1.Children.Add(l1); TextBox tb1 = new TextBox(); tb1.Name = "t" + i.ToString(); tb1.Margin = new Thickness(5, 0, 0, 0); tb1.Height = 35; tb1.Width = 250; tb1.HorizontalAlignment = HorizontalAlignment.Left; tb1.VerticalAlignment = VerticalAlignment.Top; tb1.FontSize = 20; tb1.FontFamily = new FontFamily("Trebuchet MS"); tb1.FontWeight = FontWeights.DemiBold; tb1.Background = Brushes.LightGreen; stackpChildren2.Children.Add(tb1); var selectedCell = e.AddedCells
;
var binding = new Binding(selectedCell.Column.Header.ToString()) { Mode = BindingMode.TwoWay, Source = selectedCell.Item, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; tb1.SetBinding(TextBox.TextProperty, binding); } } }
Itt majd megpróbálok egy stílust létrehozni hogy tartsam magam az mvvm-hez. És mind a label-ek mind a textboxok csak létrehozva lesznek itt, de a "faragásuk" kötésben lesz :)
Xaml kódok:

<DataGrid x:Name="dg1" AutoGenerateColumns="True" ItemsSource="{Binding}" Margin="323,114,547,322" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged" IsReadOnly="True" /> <ScrollViewer HorizontalAlignment="Left" Height="417" Margin="842,114,0,0" VerticalAlignment="Top" Width="377"> <StackPanel Orientation="Horizontal" Width="377"> <StackPanel Name="stackpChildren1" Margin="0,0,0,0" Width="159" /> <StackPanel Name="stackpChildren2" Width="200" Margin="0,0,0,0" /> </StackPanel> </ScrollViewer>
Tény hogy eléggé macerás így , és tuti hogy nem szép , de több napi keresgélés után hogy a program azt csinálja pontosan amit akarok csak így sikerült. Ha van valami praktikusabb megoldás azt előre is köszönöm.





Mutasd a teljes hozzászólást!

  • Segíthet..(WPF DataGrid Control)

    A példa alkalmazás ugyan nem mai eresztés, de letölthető, és a megoldás közelebb vihet a datagrid működésének megértéséhez.
    Mutasd a teljes hozzászólást!
  • Szia, az automatikus oszlopkiosztás helyett először próbáld meg bekötni az adatokat egy-egy oszlopba :

    <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding valami}" />
    </DataGrid.Columns>
    Mutasd a teljes hozzászólást!
  • Köszi ezt próbálgattam már én is. Eddig ez az egyetlen amivel sikerült legalább a megjelenítést összehozni.
    Egy osztály konstruktorában Readfile -> string[] -> linq split-tel megadom az osztály mezőit és var data(ienumarate data) ba teszem majd a végén 
    public ICollectionView List = CollectionViewSource.GetDefaultView(data)
    xaml-ba ItemSource="{Binding List}"
    és már működik is. Csak hogy utána ezeket a példányok adatait kiásni, vagy a datagridből select item cell valami... eh..
    Listbox-ot simán létre lehet hozni egy tömbből, utána selectedItem-ből stringet.
    ez a datagrid nagy ...... nehéz dolog. :)

    Update:
    És utána a twoway kötés sem nem működik így ááááh :(

    System.InvalidOperationException: 'A TwoWay vagy OneWayToSource kötés nem működhet „<>f__AnonymousType1`7[System.String,System.String,System.String,System.String,System.String,System.String,System.String]” típusú csak olvasható „Id” tulajdonság esetében.'
    Mutasd a teljes hozzászólást!
  • Helló,

    Elsőre nagyon furán hangzik az, amit csinálni szeretnél a leírásod alapján. Nem feltétlenül az amit, hanem az ahogy... 


    Kód beillesztése esetén használhatnád a forráskód gombot. 
    Ne csak a XAML egy sorát tedd fel. Jó lenne látni mögötte a property-t és igazából az egészet...
    Leírhatnád, hogy pontosan mi az elvárt működés.

    Én ezt úgy értelmezem, hogy szeretnél beolvasni egy fájlt és annak sorait megjeleníteni egy listában úgy, hogy minden eleme egy új sor legyen a grid-ben is.

    Ez a rész nekem pl nagyon nem esik le mi akar lenni:

    List<string>, List<List<string>>
    Az első esetén azt feltételezzük, hogy egy elemünk van soronként. A másodikban azt, hogy soronként több elemünk is lehet.

    Milyen típust ad vissza az, amikor beolvastad a CSV-t? 

    Az utolsó hozzászólásodban valami nagyon, de nagyon fura dolgot kezdtél el csinálni...

    Mit szeretnél a TwoWay Bindig-gal csinálni?
    Mutasd a teljes hozzászólást!
  • Így visszaolvasva valóban kicsit kuszának tűnik.
    Megpróbálom tisztázni...
    Szóval..Reméltem hogy lesz egy hasonló megoldás mint ahogy listboxot lehet feltölteni, és akkor a gridbox-hoz kapcsolódó további teendőimet egy már "bejáratott úton" tudom folytatni. Ez a rész a programban egy csv file bol olvas be adatokat, azokat megjeleníti mátrix szerkezetben. Az adatok termék id, név, ár, típus stb. Soronként egy termék. Ezekhez az adatokhoz szerettem volna hozzáférni. Leelenőrizni összevetni egy adatbázissal, törölni, módosítani. Majd pedig adatbázisba lementeni. 
    Nos már az elején a megjelenítésnél elakadtam mert semmit nem tudtam megjeleníteni akár vektor (1D konténer) akár mátrix 2D konténert adtam meg akár datacontextként, akár itemsourcenak. Csak vonalakat kaptam, illetve a list<stringnél> kiírta a capacity és a count értékeket. Természetesen a vektor kísérletek csak próbák voltak, hogy hátha...
    Amit kaptam WPF DataGrid Control nem volt rossz, és egy másik stackoverflow bejegyzésből összeollózva egész elfogadható megoldást hoztam létre. 

    public class Shoes { public int Id { get; set; } public string Name { get; set; } public string SubName { get; set; } public string Colour1 { get; set; } public string Colour2 { get; set; } public string Colour3 { get; set; } public string Type { get; set; } public static List<Shoes> list = new List<Shoes>(); public static List<Shoes> ReadFile(string filepath) { string[] lines = File.ReadAllLines(filepath, Encoding.Default); var data = from l in lines.Skip(1) let split = l.Split(';') select new Shoes { Id = int.Parse(split[0]), Name = split[1], SubName = split[2] == "" ? null : split[2], Colour1 = split[3], Colour2 = split[4] == "" ? null : split[4], Colour3 = split[5] == "" ? null : split[5], Type = split[6], }; Shoes.list = data.ToList(); return Shoes.list; }
    }

    Majd a Main.xaml.cs-be

    private void Start_Click(object sender, RoutedEventArgs e) { DataContext = Shoes.ReadFile(@"..\..\Csv\Test2.csv"); } private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { stackpChildren1.Children.Clear(); stackpChildren2.Children.Clear(); if (e.AddedCells.Count != 0) { for (int i = 0; i < e.AddedCells.Count; i++) { Label l1 = new Label(); l1.Name = "l" + i.ToString(); l1.Content = e.AddedCells
    .Column.Header.ToString(); l1.Margin = new Thickness(5, 0, 0, 0); l1.Height = 35; l1.Width = 385; l1.HorizontalAlignment = HorizontalAlignment.Left; l1.VerticalAlignment = VerticalAlignment.Top; l1.FontSize = 20; l1.FontFamily = new FontFamily("Trebuchet MS"); l1.FontWeight = FontWeights.DemiBold; stackpChildren1.Children.Add(l1); TextBox tb1 = new TextBox(); tb1.Name = "t" + i.ToString(); tb1.Margin = new Thickness(5, 0, 0, 0); tb1.Height = 35; tb1.Width = 250; tb1.HorizontalAlignment = HorizontalAlignment.Left; tb1.VerticalAlignment = VerticalAlignment.Top; tb1.FontSize = 20; tb1.FontFamily = new FontFamily("Trebuchet MS"); tb1.FontWeight = FontWeights.DemiBold; tb1.Background = Brushes.LightGreen; stackpChildren2.Children.Add(tb1); var selectedCell = e.AddedCells
    ;
    var binding = new Binding(selectedCell.Column.Header.ToString()) { Mode = BindingMode.TwoWay, Source = selectedCell.Item, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; tb1.SetBinding(TextBox.TextProperty, binding); } } }
    Itt majd megpróbálok egy stílust létrehozni hogy tartsam magam az mvvm-hez. És mind a label-ek mind a textboxok csak létrehozva lesznek itt, de a "faragásuk" kötésben lesz :)
    Xaml kódok:

    <DataGrid x:Name="dg1" AutoGenerateColumns="True" ItemsSource="{Binding}" Margin="323,114,547,322" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged" IsReadOnly="True" /> <ScrollViewer HorizontalAlignment="Left" Height="417" Margin="842,114,0,0" VerticalAlignment="Top" Width="377"> <StackPanel Orientation="Horizontal" Width="377"> <StackPanel Name="stackpChildren1" Margin="0,0,0,0" Width="159" /> <StackPanel Name="stackpChildren2" Width="200" Margin="0,0,0,0" /> </StackPanel> </ScrollViewer>
    Tény hogy eléggé macerás így , és tuti hogy nem szép , de több napi keresgélés után hogy a program azt csinálja pontosan amit akarok csak így sikerült. Ha van valami praktikusabb megoldás azt előre is köszönöm.





    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd