Xamarin:如何删除网格中特定行中的项目
Xamarin: How to remove an item in a specific row in Grid
我有一个网格,我正在尝试删除特定行中的项目。它处于循环中,然后当它转到第二行时,它会删除第二行中的项目以及第一行中的项目。如何调整以仅删除我想要的行?
请注意,我要做的是将第一行复制到第二行,只解决 pow (b²),在第三行,我将复制第二行,但解决 -4 * 5 (- 4 * a).
这是正在发生的事情的预览。
This 是我用来膨胀这些行的代码,要理解:
它首先进入 if(fields == null)
因为是 pow,之后进入 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);
}
}
对您要实现的目标有点困惑,但这里有一个建议。
我建议采用 MVVM 模式。在代码中操纵 UI 不是最好的主意。
<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
}
您对列表所做的每项更改都会在您的 UI 中显示。
这是使用网格单元格的完整示例。
概念是您首先创建所有单元格。在这里,我在每个网格单元格中使用 Label
。为了更容易理解,我将每个单元格的文本设置为我分配给它的“CellNumber”。一旦你明白这是怎么回事,就把一个空字符串 ""
作为初始值。
为了便于查找单元格,有一个 Dictionary
包含它们。 CellNumber(row, column)
将 key
赋给该字典,以找到相应的单元格。
Calculate
按钮对单元格进行一些更改,因此您可以了解如何操作。
我建议不要在初始化后添加或删除单元格(网格的子项)。相反,显示或隐藏一个单元格。在这里,您通过更改 Label
的 Text
来完成此操作。对于其他类型的 View
,您可以将 View.IsVisible
更改为 true 或 false。
MainPage.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>
MainPage.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);
}
}
}
我有一个网格,我正在尝试删除特定行中的项目。它处于循环中,然后当它转到第二行时,它会删除第二行中的项目以及第一行中的项目。如何调整以仅删除我想要的行?
请注意,我要做的是将第一行复制到第二行,只解决 pow (b²),在第三行,我将复制第二行,但解决 -4 * 5 (- 4 * a).
这是正在发生的事情的预览。
This 是我用来膨胀这些行的代码,要理解:
它首先进入 if(fields == null)
因为是 pow,之后进入 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);
}
}
对您要实现的目标有点困惑,但这里有一个建议。
我建议采用 MVVM 模式。在代码中操纵 UI 不是最好的主意。
<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
}
您对列表所做的每项更改都会在您的 UI 中显示。
这是使用网格单元格的完整示例。
概念是您首先创建所有单元格。在这里,我在每个网格单元格中使用 Label
。为了更容易理解,我将每个单元格的文本设置为我分配给它的“CellNumber”。一旦你明白这是怎么回事,就把一个空字符串 ""
作为初始值。
为了便于查找单元格,有一个 Dictionary
包含它们。 CellNumber(row, column)
将 key
赋给该字典,以找到相应的单元格。
Calculate
按钮对单元格进行一些更改,因此您可以了解如何操作。
我建议不要在初始化后添加或删除单元格(网格的子项)。相反,显示或隐藏一个单元格。在这里,您通过更改 Label
的 Text
来完成此操作。对于其他类型的 View
,您可以将 View.IsVisible
更改为 true 或 false。
MainPage.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>
MainPage.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);
}
}
}