从Task填充时,C#DataGridView不显示Scrollbars

时间:2017-08-08 16:54:22

标签: c# winforms datagridview scrollbars

我目前看到以下问题: 我有一个DataGridView,由后台运行的任务填充。任务完成后,DataGridView中的滚动条和单元格无法正确显示...在将对话框调整为全屏模式(最大化)后,滚动条会正确显示...每当调整大小时以其他方式完成(最小化),滚动条再次失败......这里有什么想法吗?是否有任何刷新事件我可以从任务中触发重新调整滚动条和单元格?

**附加信息:**使用Dock = Fill将DataGridView打包到TableLayoutPanel上。

enter image description here enter image description here

修改 数据加载通过

完成
private void TryLoadData()  
{
    try
    {
        LoadData();
    }
    catch (Exception ex)
    {
        //Just some error logging
        _log.Error(ex);
        _errorHandler.Show(ex);
    }
}

private void LoadData()
{
    ClearRows();
    //Loading from database
    var data = _databaseAdapter.Get<Data, bool>(x => !x.Deleted);
    foreach (var singleDatum in data)
        LoadDataRowToDataGridView (singleDatum);
}

private void ClearRows()
{
    this.UiThreadInvoke(() => { DataGridView.Rows.Clear(); });
}

private void LoadDataRowToDataGridView(Data singleDatum)
{
    this.UiThreadInvoke(() => { DataGridView.Rows.Add(singleDatum.Id, singleDatum.Name); });
}

通过以下方式发起:

new Task(TryLoadData).Start();

UiThreadInvoke:

using System;
using System.Windows.Forms;

namespace UIExtensions
{
    public static class UiThreadInvokeExtension
    {
        public static void UiThread(this Control control, Action code)
        {
            if (control.InvokeRequired)
            {
                control.BeginInvoke(code);
                return;
            }
            code.Invoke();
        }

        public static void UiThreadInvoke(this Control control, Action code)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(code);
                return;
            }
            code.Invoke();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

试试这些

<强> 1。设置这些属性

ContactsDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
ContactsDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;

<强> 2。像这样插入

ContactsDataGridView.Invoke(new Action(() =>
{
    ContactsDataGridView.Rows.Add(kvp.Key, kvp.Value, new DataGridViewButtonCell(), new DataGridViewButtonCell());
}));

答案 1 :(得分:0)

当您调整屏幕大小时,应用程序会重新绘制并渲染窗口。尝试在加载数据时强制渲染网格。

datagridview1.update(); datagridview1.refresh();