Xamarin: Как удалить элемент в определенной строке таблицы

0

Вопрос

У меня есть сетка, в которой я пытаюсь удалить элемент в определенной строке. Он находится в цикле, затем, когда он переходит ко второй строке, он удаляет элемент во второй строке, а ТАКЖЕ в первой строке. Как я могу настроить удаление только той строки, которую я хочу?

Обратите внимание, что я пытаюсь скопировать первую строку во вторую, решая только pow (b2), а в третьей строке я скопирую вторую строку, но решу -4 * 5 (-4 * a).

Это предварительный просмотр того, что происходит.

Это мой код, чтобы раздуть эти строки, чтобы понять: Он входит первым в if(fields == null) потому что военнопленный, после этого, отправляется в 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

Лучший ответ

1

Вот полный пример работы с ячейками сетки.

Концепция заключается в том, что вы сначала создаете все ячейки. Здесь я использую Label в каждой ячейке сетки. Чтобы было проще понять, я устанавливаю текст каждой ячейки на "Номер ячейки", который я ей присваиваю. Как только вы поймете, что происходит, просто поместите пустую строку "" в качестве начального значения.

Чтобы упростить поиск ячеек, существует Dictionary сдерживая их. CellNumber(row, column) дает key в этот словарь, чтобы найти соответствующую ячейку.

Calculate кнопка вносит некоторые изменения в ячейки, так что вы можете увидеть, как это сделать.

Я рекомендую НЕ добавлять и не удалять ячейки (дочерние элементы сетки) после инициализации. Вместо этого ПОКАЖИТЕ или СПРЯЧЬТЕ ячейку. Здесь вы делаете это, изменяя Text из-за Label. Для других видов Viewс, вы можете измениться View.IsVisible к истине или лжи.

Главная страница.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>

Главная страница.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

Спасибо, я последовал идее создать список сетки, а затем просто показать, видна она или нет.
Que44
0

Немного смущен тем, чего вы пытаетесь достичь, но вот вам сладкое.

Я рекомендую использовать шаблон MVVM. Манипулирование пользовательским интерфейсом в коде-не лучшая идея.

<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
}

Каждое изменение, внесенное вами в список, будет отображаться в вашем пользовательском интерфейсе.

2021-11-24 19:06:24

На других языках

Эта страница на других языках

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