一种可能导致DataGridView无法显示数据问题的原因以及解决方案

2 篇文章 0 订阅
1 篇文章 0 订阅

现象:软件在打开后直接查看A界面(DataGridView,通过DataSouce绑定DataTable)数据时,数据正常显示;

若软件打开后产看其他(B)界面后,再查看A数据时,A无法显示数据。

原因:B界面显示时,调用了用于动态调整数据再属性栏(PropertyGrid)中的显示,若对象中存在未设置完整属性的Attribute的可能会导致问题的出现:

         private void SetPropertyBrowsable(object obj, string propertyName, bool browsable)
        {
            Type type = typeof(BrowsableAttribute);

            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);

            if (props[propertyName] == null)
                return;
            AttributeCollection attrs = props[propertyName].Attributes;

            FieldInfo fld = type.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
            if (fld != null)
            {
                fld.SetValue(attrs[type], browsable);
            }
        }

具体原因:对类字段而非属性动态设置了属性可视,导致软件异常显示。

即:Class ABC

{

string Name;

}

使用时, abc = new  ABC();

SetPropertyBrowable(abc,"Name",false);//此句导致软件异常。

解决方案:设置属性Attribute

Class ABC

{

[Browsable(true)] //添加此语句

string Name{get;set;};//并且修改为属性

}

然后再调用SetPropertyBrowable(abc,"Name",false)时可正常使用。

注意:本类ABC内需要保证所有的属性都设置[Browsable(XXXX)] 属性,否则可能会导致未设置的属性显示异常。

 

希望对遇到此问题的朋友有帮助!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的DataGridView控件是用于显示和编辑数据的强大工具。要实现分页显示数据,可以通过以下步骤进行操作: 1. 准备数据源:首先,你需要准备一个数据源,可以是数据库中的表、集合或其他数据结构。 2. 设置DataGridView属性:在窗体设计器中,将DataGridView控件拖放到窗体上,并设置一些基本属性,如Name、Dock、AutoSizeColumnsMode等。 3. 分页逻辑:实现分页逻辑的关键是确定每页显示数据量和当前页码。你可以定义一个变量来保存当前页码,并根据每页显示数据量计算出总页数。 4. 数据绑定:在窗体加载事件中,将数据源绑定到DataGridView控件上。可以使用DataGridView.DataSource属性数据源与控件关联。 5. 分页显示:根据当前页码和每页显示数据量,从数据源中获取对应的数据,并将其显示DataGridView控件中。可以使用DataGridView.Rows.Clear()方法清空原有数据,然后使用DataGridView.Rows.Add()方法逐行添加新数据。 6. 分页按钮:为了方便用户切换页码,可以添加上一页、下一页等按钮,并在按钮的点击事件中更新当前页码,并重新加载数据。 下面是一个简单的示例代码,演示了如何实现分页显示数据: ```csharp // 定义全局变量 int pageSize = 10; // 每页显示数据量 int currentPage = 1; // 当前页码 int totalPage; // 总页数 List<DataItem> dataSource; // 数据源 // 窗体加载事件 private void Form_Load(object sender, EventArgs e) { // 获取数据源(示例中使用List<DataItem>作为数据源) dataSource = GetData(); // 计算总页数 totalPage = (int)Math.Ceiling(dataSource.Count / (double)pageSize); // 显示第一页数据 ShowData(); } // 显示数据 private void ShowData() { // 清空原有数据 dataGridView.Rows.Clear(); // 计算当前页的起始索引和结束索引 int startIndex = (currentPage - 1) * pageSize; int endIndex = Math.Min(startIndex + pageSize, dataSource.Count); // 添加当前页的数据DataGridView控件中 for (int i = startIndex; i < endIndex; i++) { DataItem item = dataSource[i]; dataGridView.Rows.Add(item.Column1, item.Column2, item.Column3); } // 更新分页信息 lblPageInfo.Text = $"第 {currentPage} 页 / 共 {totalPage} 页"; } // 上一页按钮点击事件 private void btnPrevious_Click(object sender, EventArgs e) { if (currentPage > 1) { currentPage--; ShowData(); } } // 下一页按钮点击事件 private void btnNext_Click(object sender, EventArgs e) { if (currentPage < totalPage) { currentPage++; ShowData(); } } // 获取数据源(示例方法,你需要根据实际情况修改) private List<DataItem> GetData() { // 从数据库或其他数据源中获取数据,并返回一个List<DataItem>对象 // 这里只是一个示例,你需要根据实际情况修改 List<DataItem> data = new List<DataItem>(); // ... return data; } ``` 这是一个简单的分页显示数据的示例,你可以根据自己的需求进行修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值