Xamarin: Jak usunąć element do określonego wiersza w tabeli

0

Pytanie

Mam siatka, w której staram się usunąć element w danym wierszu. On jest w pętli, a następnie, gdy on przechodzi do drugiej linii, usuwa element w drugim wierszu, a TAKŻE w pierwszym wierszu. Jak mogę skonfigurować usunięcie tylko tego wiersza, którą chcę?

Należy pamiętać, że próbuję skopiować pierwszy wiersz drugi, rozwiązując tylko pow (b2), a w trzecim wierszu ja to skopiuję drugą linię, ale zdecyduję -4 * 5 (-4 * a).

To jest podgląd tego, co się dzieje.

To jest mój kod, aby napompować te słowa, aby zrozumieć: Loguje się pierwszy w if(fields == null) dlatego, że jest jeńcem wojennym, po tym, wyrusza w else:

for (int i = 0; i < qntLines; i++)
{
   string field = lines[i].Substring(0, lines[i].IndexOf('#'));
   string operation = lines[i].Substring(lines[i].IndexOf('#') + "#".Length);

   CreateResultLine(field, operation, i, listTexts);
}

private void CreateResultLine(string field, string operation, int i, List<string> listTexts)
{
            string[] fields = null;
            List<string> texts = new List<string>();
            string text = string.Empty;
            dynamic textResult;
            int count = new int();

            if (field.Contains(','))
                fields = field.Split(',', (char)StringSplitOptions.RemoveEmptyEntries);
            
            if (fields == null)
            {
                text = listTexts[int.Parse(field)];
                text = RemovePow(text);
                texts.Add(text);
                textResult = ExecuteOperation(texts, operation);
                
                gridFrame.Children.RemoveAt(int.Parse(field) + 1);
                gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center, 
                    TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, int.Parse(field) + 1, i);
            }
            else
            {
                foreach (var item in fields)
                {
                    string noPow = string.Empty;
                    noPow = RemovePow(listTexts[int.Parse(item)]);
                    texts.Add(noPow);
                    ++count;
                }
                textResult = ExecuteOperation(texts, operation);

                for (int i2 = int.Parse(fields[0]); i2 <= int.Parse(fields[1]);)
                {
                    gridFrame.Children.RemoveAt(int.Parse(fields[0]));
                    
                    ++i2;
                }

                gridFrame.Children.Add(new Label() { Text = textResult.ToString(), HorizontalTextAlignment = TextAlignment.Center, 
                    TextColor = Color.Blue, HorizontalOptions = LayoutOptions.Center }, int.Parse(fields[0]) + 1, i);
            }
        }
c# dynamic grid xamarin
2021-11-23 23:29:00
2

Najlepsza odpowiedź

1

Oto pełna przykład pracy z komórkami siatki.

Koncepcja polega na tym, że najpierw tworzysz wszystkie komórki. Używam tutaj Label w każdej komórce siatki. Aby było łatwiej zrozumieć, ja ustalam tekst każdej komórki na Numer komórki, który jej присваиваю. Jak tylko zrozumiesz, co się dzieje, po prostu umieść pusty wiersz "" jako wartości początkowej.

Aby ułatwić wyszukiwanie komórek, istnieje Dictionary trzymając je. CellNumber(row, column) daje key w ten słownik, aby znaleźć odpowiednią komórkę.

Calculate przycisk sprawia, że pewne zmiany w komórkach, dzięki czemu można zobaczyć, jak to zrobić.

Polecam NIE dodawać i usuwać komórki (elementy potomne siatki) po inicjalizacji. Zamiast tego POKAŻ lub UKRYJ komórkę. Tutaj można to zrobić, zmieniając Text z powodu Label. Dla innych gatunków Viewz, można ulec zmianie View.IsVisible do prawdy lub kłamstwa.

Strona główna.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="ManipulateGridChildren.MainPage">

    <Grid x:Name="Formulas" BackgroundColor="#A0A0A0"
          RowSpacing="2" ColumnSpacing="2" Padding="2"
          ColumnDefinitions="*,*,*,*,*,*,*,*"
          RowDefinitions="40,40,40,Auto">
        <Button Grid.Row="3" Text="Calc" Command="{Binding CalcCommand}" />
    </Grid>

</ContentPage>

Strona główna.xaml.cs:

using System.Collections.Generic;
using Xamarin.Forms;

namespace ManipulateGridChildren
{
    public partial class MainPage : ContentPage
    {
        const int NRows = 3;
        static int NColumns = 8;
        const int MaxColumns = 100;

        private Dictionary<int, Label> cells = new Dictionary<int, Label>();

        public MainPage()
        {
            InitializeComponent();
            AddCells();
            CalcCommand = new Command(Calculate);
            BindingContext = this;
        }

        public Command CalcCommand { get; set; }

        private void Calculate()
        {
            SetCellText(0, 0, "A");
            SetCellText(0, 2, "B");
            SetCellText(1, 0, "C");
            SetCellText(2, 3, "D");
            SetCellBackground(2, 3, Color.Pink)
        }

        private void SetCellText(int row, int column, string text)
        {
            cells[CellNumber(row, column)].Text = text;
        }

        private void SetCellBackground(int row, int column, Color color)
        {
            cells[CellNumber(row, column)].BackgroundColor = color;
        }

        private void AddCells()
        {
            // Grid rows and columns are numbered from "0".
            for (int row = 0; row < NRows; row++) {
                for (int column = 0; column < NColumns; column++) {
                    var cell = AddCell(row, column);
                    cells[CellNumber(row, column)] = cell;
                }
            }

            // Add "frames" around some rows.
            // AFTER adding the cells, so drawn on top.
            AddFrame(0, 1, 0, NColumns);
            AddFrame(1, 2, 0, NColumns);
        }

        private Label AddCell(int row, int column)
        {
            var cell = new Label();
            // For debugging - show where each cell is.
            // Once you understand, change this to an empty string.
            cell.Text = $"{CellNumber(row, column)}";
            cell.BackgroundColor = Color.White;
            cell.HorizontalTextAlignment = TextAlignment.Center;
            cell.VerticalTextAlignment = TextAlignment.Center;
            Formulas.Children.Add(cell, column, row);
            return cell;
        }

        // Assign unique number to each cell.
        private int CellNumber(int row, int column)
        {
            return row * MaxColumns + column;
        }

        private void AddFrame(int row, int rowSpan, int column, int columnSpan)
        {
            var rect = new Xamarin.Forms.Shapes.Rectangle {
                Stroke = new SolidColorBrush(Color.Black),
                StrokeThickness = 2
            };

            Formulas.Children.Add(rect, column, column + columnSpan, row, row + rowSpan);
        }
    }
}
2021-11-24 19:14:51

Dziękuję, ja za pomysł utworzyć listę siatki, a następnie po prostu pokazać, jest widoczny czy nie.
Que44
0

Trochę zdezorientowany tym, co starasz się osiągnąć, ale to jest słodkie.

Polecam użyć wzorca MVVM. Manipulacja interfejsem użytkownika w kodzie-nie najlepszy pomysł.

<ContentPage.BindingContext>
   <local: MainViewModel />
</ContentPage.BindingContext>

<ContentPage.Content>

  <ListView ItemSource={Binding ListOfItems}>
     <ListView.ItemTemplate>
       <DataTemplate>
          <ViewCell>
             <Label Text={Binding .}/>
          <ViewCell>
       </DataTemplate>
     </ListView.ItemTemplate>
  </ListView>
</ContentPage.Content>

MainViewModel.cs

public class MainViewModel : INotifyPropertyChanged
{

public ObservableCollection<string> ListOfItems {get;set;} = new ObservableCollection<string>();

public void DeleteAnItem(string s)
{
  ListOfItems.Remove(s);
}

public void AddItem(string s)
{
 ListOfItems.Add(s);
}

public void RemoveAtIndex(int i)
{
  ListOfItems.RemoveAt(i);
}

#region TheRestOfPropertyChanged
...
#endregion
}

Każda zmiana wpisana przez ciebie do listy, pojawi się w interfejsie użytkownika.

2021-11-24 19:06:24

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................