简体   繁体   中英

WPF - How to get height of each row in DataGrid?

I have a DataGrid that has TextWrapping enabled in cells. Meaning that rows don't have same height. My question is how do I loop through rows and get whats the height of each one? How the DataGrid looks like: 在此处输入图片说明

Here is the datagrid code:

    public ObservableCollection<Article> persons = new ObservableCollection<Article>();

for(int i = 0; i < 35; i++)
{
    persons.Add(new Article("Restless legs syndrome and tis correlation with other sleep problems in the general adult population of Japan",
                         "Minori Enomoto, Lan Li, Sayaka Aritake, Yukihiro Nagase, Tatsuhiko Kaji, Hirokuni Tagaya, Masato Matsuura, Yoshitaka Kaneita, Takashi Ohida, Makoto Uchiyama",
                         "Sleep and Biological Rhythms",
                         4));
}

dgMain.ItemsSource = persons;

Here is how I counted it:

        private void btnTest_Click(object sender, RoutedEventArgs e)
    {
        int k = 0;
        var rows = GetDataGridRows(dgMain);

        foreach (DataGridRow r in rows)
        {
            var rowHeight = r?.ActualHeight;
            k++;
        }

        MessageBox.Show(k.ToString());
    }

And here is the Article class:

    public class Article
{
    private string _title;
    public string Title
    {
        get { return this._title; }
        set { this._title = value; }
    }

    private string _authors;
    public string Authors
    {
        get { return this._authors; }
        set { this._authors = value; }
    }

    private string _journal;
    public string Journal
    {
        get { return this._journal; }
        set { this._journal = value; }
    }

    private int _year;
    public int Year
    {
        get { return this._year; }
        set { this._year = value; }
    }

    public Article(string Title, string Authors, string Journal, int Year)
    {
        this._title = Title;
        this._authors = Authors;
        this._journal = Journal;
        this._year = Year;
    }
}            

You can do something like this

var rows = GetDataGridRows(datagrid);

foreach (DataGridRow r in rows)
 {
       var rowHeight = r?.ActualHeight;
 }
  public IEnumerable<DataGridRow> GetDataGridRows(System.Windows.Controls.DataGrid grid)
        {
            var itemsSource = grid.ItemsSource as IEnumerable;
            if (null == itemsSource) yield return null;
            foreach (var item in itemsSource)
            {
                var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
                if (null != row) yield return row;
            }
        }

Xaml

<StackPanel Orientation="Vertical" >
        <Button Click="Button_Click" Height="39" Width="40"></Button>
        <DataGrid x:Name="dgMain" AutoGenerateColumns="True"  HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="auto" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" >

        </DataGrid>

    </StackPanel>

ss工作

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM