سلام وقت بخیر
شاید عنوان تاپیک بنظر تکراری بیاد اما در WPF من کلی جستجو کردم ولی دراین باره یک سری مشکلاتی هستم که ممنون میشوم درصورت امکان راهنمایی کنید.
مساله این هست که من میخواستم یک ستون در دیتاگرید ایجاد کنم بطوری که شماره ردیف بصورت خودکار از 1 تا تعداد کل ردیف در آن ایجاد بشه.
در ویندوز فرم نحوه انجام اینکار خیلی راحت هست و از DataGridViewCellFormattingEventArgs میتوانیم کمک بگیریم و به این شکل در ستون موردنظر شماره ردیف خودکار را ایجاد کنیم :
private void dataGridView_details_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
dataGridView_details.Rows[e.RowIndex].Cells["radif"].Value = e.RowIndex + 1;
}
اما در WPF من با جستجو به 2 راه رسیدم اما در هردو آنها مشکلاتی وجود دارد.
روش اول به کمک کلاس کانورتر :
کد های XAML :
<Window.Resources> <local:ConvertItemToIndex x:Key="IndexConverter"/>
</Window.Resources>
<Grid>
<DataGrid>
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Content" Value="{Binding Converter={StaticResource IndexConverter}}"/>
<Setter Property="Width" Value="30"/>
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.Columns> </DataGrid.Columns>
</DataGrid>
و کلاس :
public class ConvertItemToIndex : IValueConverter {
private static int checkNumber;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
return ++checkNumber;
}
catch (Exception e)
{
throw new NotImplementedException(e.Message);
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
مشکلی که این روش گفته شده دارد این هست که اولین بار که برنامه اجرا میشود مطابق تصویر زیر شماره ردیف بصورت خودکار ایجاد میشود :اما اگر بین ردیف ها اسکرول کنیم کل این شماره ردیف ها به هم میریزه !!
من ارتباطی بین این مشکل و کلاس مربوطه نتونستم پیداکنم تا مشکل را حل کنم .
روش دوم به کمک LoadingRow: این روش بدرستی کار میکنه و در اسکرول کردن هم مشکل نداره اما ایا میشود بجای اینکه این شماره گذاری در HEADER انجام بشه بیاییم در یک ستون موردنظر اینکارو انجام بدیم؟
<Grid LoadingRow="DataGrid_LoadingRow" >
<DataGrid>
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Width" Value="30"/>
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.Columns> </DataGrid.Columns>
</DataGrid>
و
void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e) {
e.Row.Header = (e.Row.GetIndex()+1).ToString();
}
در هرحال من هدفم این هست که یک ستون ایجاد کنم و شماره ردیف بصورت خودکار داخلش نمایش داده شود.