私はDataGrid
この方法でデータベースから自分にアイテムをロードしています(フォームのロード時):
dataGridArticles.ItemsSource = null;
dataGridArticles.ItemsSource = listCurrentArticles;
また、データグリッドリストにアイテムを追加する機能があり、DELキーを押すことでアイテムを削除することもできます<データグリッドは自動的にリストからアイテムを削除します>。
しかし、データグリッドのソースであるリストにアイテムを入力するときは、各アイテムにOrdinalNumberも設定します。たとえば、リストに新しいアイテムを追加するときは、次のことを行います。
article.OrdinalNumber = GetCurrentlyMaxOrdinalNumber()+1;
したがって、アイテムを次々に追加すると、序数は1、2、3、4、5 ...などになり、次のようになります(赤でマーク):
記事テーブルから最大序数を返すストアドプロシージャ:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ArticleGetNextCodeNumber`()
BEGIN
Select ifnull(max(OriginalArticleCode),0)
from articles;
END
そして、これは私が私のリストに新しいアイテムを追加しているときに起こっていることです:私は新しい記事のために次の序数と他のいくつかの属性を設定しています:
private void btnSaveChangesOnArticle_Click(object sender, RoutedEventArgs e)
{
try
{
if (newItem)
{
Article newArticle = new Article();
newArticle.ArticleCode = txtArticleCode.Text.Trim();
newArticle.OriginalArticleCode = Convert.ToInt32(ArticlesController.Instance.GetNextArticleCode()) + 1; // Here I'm setting new article ordinal number
newArticle.Title = txtArticleTitle.Text.Trim();
newArticle.Price = Convert.ToDecimal(txtPrice.Text.Trim());
var lastInserted = ArticlesController.Instance.Save(newArticle);
MessageBox.Show("Operation Successful.");
listCurrentArticles.Add(lastInserted);
dataGridArticles.ItemsSource = null;
dataGridArticles.ItemsSource = listCurrentArticles;
}
}
}
}
そして今、ユーザーがDELETE KEYを押してデータグリッドからアイテムを削除したときに、序数を再編成するにはどうすればよいでしょうか。たとえば、データグリッドに5つのアイテムを追加した場合、ユーザーが2番目のアイテムを削除した場合、注文よりも次のようになります:1 3 4 5 .. 1 2 34の挿入
だから私の質問はみんなです、それを常に順序付けておくために何かが変わったとき、どうすればそれを再編成できますか(それで私にとって重要ではないので序数をデータベースに保持する必要はないかもしれません、私はそれを使っていますUIの見栄えを良くし、DataGridに追加したアイテムの数をユーザーに表示します)。
どうもありがとう、乾杯!
OrdinalNumberDataGridTextColumn
をaに置き換え、コンバーターをDataGridTemplateColumn
使用しGetIndex()
て親DataGridRow
コンテナーのメソッドの値を返すことができます。
アイテムの数が変更されたとき、つまりアイテムが追加または削除されたときにバインドが更新されるようにするには、親DataGridRow
とそれ自体Count
のItems
プロパティのプロパティの両方にバインドする必要がありDataGrid
ます。
これは実装が非常に簡単なはずです。IMultiValueConverter
インターフェイスを実装するクラスを作成します。
namespace WpfApplication3
{
public class RowNumberConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return ((values[0] as DataGridRow).GetIndex() + 1).ToString();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
そして、次のように使用します。
<DataGrid x:Name="dataGridArticles" AutoGenerateColumns="False" xmlns:local="clr-namespace:WpfApplication3">
<DataGrid.Resources>
<local:RowNumberConverter x:Key="RowNumberConverter" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="#" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource RowNumberConverter}">
<Binding Path="." RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
<Binding Path="Items.Count" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- + the rest of your columns -->
</DataGrid.Columns>
</DataGrid>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加