C# DataGridView 从任务填充时不显示滚动条

问题描述 投票:0回答:3

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

**附加信息:** DataGridView 通过 Dock = Fill 打包到 TableLayoutPanel 上。

编辑: 数据加载是通过

完成的
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();
        }
    }
}
c# winforms datagridview scrollbars
3个回答
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());
}));

0
投票

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

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


0
投票

我发现这正在寻找解决我的类似问题的方法,我从后台线程将网格加载到 TabPage 上,该后台线程将通过 grid.Invoke 设置网格的数据源。如果加载发生在页面尚未显示时,则当我选择该页面时滚动条不会显示,直到我最小化/最大化表单。对我来说,我可以通过订阅 TabPage Enter 事件来解决这个问题;然后我调用了 SuspendLayout(),然后调用了 ResumeLayout(),滚动条出现了。我在尝试其他各种方法来补救时偶然发现了这一点。 Refresh() 和 Invalidate() 对我不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.