Search code examples
xamarin.formsgriddatatemplatecollectionview

adding and deleting column in collection view programmatically xamarin.forms


i have a collection view with a grid inside its DataTemplate. here is the code:

xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="flyout.Page1">
    
    <ContentPage.ToolbarItems >

        <ToolbarItem Order="Secondary"
                     Text="logout"
                     Priority="2"
                  Clicked="ToolbarItem_Clicked"
                     
                    />
    </ContentPage.ToolbarItems>
  
    <ContentPage.Content>
       
                <CollectionView x:Name="lstl"
                  SelectionChanged="lstl_SelectionChanged"
                        SelectionMode="Single"
                       
                >
                    <CollectionView.Header>
                
                        <Grid Padding="2" ColumnSpacing="1" RowSpacing="1" >
                            <Grid.RowDefinitions>
                                <RowDefinition Height="35" />

                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="90" />
                                <ColumnDefinition Width="90" />
                                <ColumnDefinition Width="90"/>
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="90" />
                            </Grid.ColumnDefinitions>

                            <Label Grid.Column="0"
                       Text="name"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            <Label Grid.Column="1"
                       Text="code"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            <Label
                       Grid.Column="2"
                       Text="price"
                       LineBreakMode="TailTruncation"
                       FontAttributes="Italic"
                        />
                            <Label
                       Grid.Column="3"
                       Text="quantity"
                       LineBreakMode="TailTruncation"
                       FontAttributes="Italic"
                       />
                            <Label
                       Grid.Column="4"
                       Text="unit"
                       LineBreakMode="TailTruncation"
                       FontAttributes="Italic"
                       />
                            <Label
                       Grid.Column="5"
                       Text="place"
                       LineBreakMode="TailTruncation"
                       FontAttributes="Italic"
                       />
                        </Grid>
                    
            </CollectionView.Header>
                    
                    <CollectionView.ItemTemplate>
                        
                        <DataTemplate >
                    <Grid x:Name="MyGrid" Padding="0" ColumnSpacing="-1" RowSpacing="-1" >
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="40" />

                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="0.5*" x:Name="code" />
                                    <ColumnDefinition Width="0.7*" />
                                    <ColumnDefinition Width="0.7*" />
                                    <ColumnDefinition Width="0.7*" />
                                    <ColumnDefinition Width="0.3*" />
                                    <ColumnDefinition Width="0.7*" />
                                </Grid.ColumnDefinitions>
                        <StackLayout  Grid.Column="0" Orientation="Vertical" >
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout   Orientation="Horizontal">

                                <BoxView 
                                    Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                               x:Name="col1"
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>

                        <StackLayout  Grid.Column="1" Orientation="Vertical">
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout  HeightRequest="40" Orientation="Horizontal">
                                <BoxView   Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                                
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>
                        <StackLayout  Grid.Column="2" Orientation="Vertical">
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout  HeightRequest="40" Orientation="Horizontal">
                                <BoxView   Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                                
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>

                        <StackLayout  Grid.Column="3" Orientation="Vertical">
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout  HeightRequest="40" Orientation="Horizontal">
                                <BoxView   Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                                
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>
                        <StackLayout  Grid.Column="4" Orientation="Vertical">
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout  HeightRequest="40" Orientation="Horizontal">
                                <BoxView   Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                                
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>

                        <StackLayout  Grid.Column="5" Orientation="Vertical">
                            <BoxView HeightRequest="1" Color="Black" />
                            <StackLayout  HeightRequest="40" Orientation="Horizontal">
                                <BoxView   Margin="0,-6,0,0"
               VerticalOptions="FillAndExpand"
               HorizontalOptions="Start"
               WidthRequest="1"
               Color="Black"/>
                                <Label HorizontalOptions="Center"
                                
                                TextColor="#ffc40c"
                       Text="{Binding name}"
                       FontAttributes="Bold"
                       LineBreakMode="TailTruncation" />
                            </StackLayout>
                        </StackLayout>

                    </Grid>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
          

    </ContentPage.Content>
</ContentPage>

this is a trial code. i want to add a button outside the collection view that would remove or add a column to it. i thought of accessing the grid by name but i found out that it is not possible to access any view inside a datatemplate by name. i searched and found something like this: http://5.9.10.113/65181774/xamarin-forms-how-to-change-ui-label-text-inside-datatemplate but i didn't actually understand what was done. would anyone help me figure out the steps needed to do so? thanks in advance.


Solution

  • You could rewrite the header and datatemplate like the code below in button click event.

         private void Button_Clicked(object sender, EventArgs e)
        {
    
            var header_grid = new Grid { Padding = 2, ColumnSpacing = 1, RowSpacing = 1 };
            header_grid.RowDefinitions.Add(new RowDefinition { Height = 35 });
            header_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
            header_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
            header_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
            header_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.3, GridUnitType.Star) });
            header_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
    
            Label code = new Label { FontAttributes = FontAttributes.Bold };
            code.Text = "code";
            Label price = new Label { FontAttributes = FontAttributes.Bold };
            price.Text = "price";
            Label quality = new Label { FontAttributes = FontAttributes.Bold };
            quality.Text = "quality";
            Label unit = new Label { FontAttributes = FontAttributes.Bold };
            unit.Text = "unit";
            Label place = new Label { FontAttributes = FontAttributes.Bold };
            place.Text = "place";
    
            header_grid.Children.Add(code, 0, 0);
            header_grid.Children.Add(price, 1, 0);
            header_grid.Children.Add(quality, 2, 0);
            header_grid.Children.Add(unit, 3, 0);
            header_grid.Children.Add(place, 4, 0);
    
            lstl.Header = header_grid;
    
    
    
            lstl.ItemTemplate = new DataTemplate(() =>
           {
               Grid grid1 = new Grid { Padding = 0, ColumnSpacing = -1, RowSpacing = -1 };
               grid1.RowDefinitions.Add(new RowDefinition { Height = 40 });
               grid1.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
               grid1.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
               grid1.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
               grid1.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.3, GridUnitType.Star) });
               grid1.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0.7, GridUnitType.Star) });
    
               Label label_code = new Label { HorizontalOptions = LayoutOptions.Center };
               label_code.SetBinding(Label.TextProperty, "name");
    
               Label label_price = new Label { HorizontalOptions = LayoutOptions.Center };
               label_price.SetBinding(Label.TextProperty, "name");
    
               Label label_quality = new Label { HorizontalOptions = LayoutOptions.Center };
               label_quality.SetBinding(Label.TextProperty, "name");
    
               Label label_unit = new Label { HorizontalOptions = LayoutOptions.Center };
               label_unit.SetBinding(Label.TextProperty, "name");
    
               Label label_place = new Label { HorizontalOptions = LayoutOptions.Center };
               label_place.SetBinding(Label.TextProperty, "name");
    
               grid1.Children.Add(label_code, 0, 0);
               grid1.Children.Add(label_price, 1, 0);
               grid1.Children.Add(label_quality, 2, 0);
               grid1.Children.Add(label_unit, 3, 0);
               grid1.Children.Add(label_place, 4, 0);
    
               return grid1;
           });
        }
    

    I just change the template. You need to add more details in code behind.