VB.NET学习笔记:如何解决多线程下WinForm窗体控件错误——DataGridView中发生异常 索引0没有值

今天在多线程环境下测试代码时DataGridView控件报错——DataGridView中发生以下异常:索引13039没有值。而且DataGridView控件刷新很慢,需要用鼠标点击DataGridView控件列标题才刷新。如图所示。
在这里插入图片描述

测试工程:

新建windows应用程序,包含1个窗体,窗体中放一个DataGridView控件和一个Button控件,界面如图所示。
在这里插入图片描述
为窗体添加如下代码:

Imports System.Threading

Public Class Form1
    Private dt As New DataTable '定义DataGridView数据源
    Private icount As Integer = 0 '记录点击按钮的次数
    Private th As Thread '定义线程
   
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        '构建内存表的列
        dt.Columns.Add("ID", Type.GetType("System.String"))
        dt.Columns.Add("name", Type.GetType("System.String"))
        'DataGridView绑定数据源
        DataGridView1.DataSource = dt
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        icount &#
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/// <summary> /// 获取总页数 /// </summary> /// <param name="recordcount">总记录数</param> /// <param name="page_size"></param> /// <returns></returns> public static int GetPageCount(int recordcount, int page_size) { int pagecount = 0; if (recordcount % page_size == 0) pagecount = recordcount / page_size; else pagecount = (recordcount / page_size) + 1; return pagecount; } /**//// <summary> /// 获取分页数据 /// </summary> /// <param name="kl2">DATASET</param> /// <param name="page_size">每页记录数</param> /// <param name="pageindex">页索引</param> /// <param name="page_sum">总页数</param> /// <returns></returns> public static DataView GetPagerForView(DataTable dt, int page_size, int pageindex,out string msg) { DataView dv = new DataView(); if (dt != null) { int recordCount = dt.Rows.Count; //总记录数 int page_sum = GetPageCount(recordCount, page_size); if (page_size < dt.Rows.Count)//kl2 :SQL查询函数返回的DATASET { if (page_size == 0)//text_intpase :判断用户设置的分页是否合法 page_size = 10; //recordCount = kl2.Tables[0].Rows.Count;//假设每页只显示1条数据,则共可以显示的页数:pagemark页 if (page_size < 1) { msg = "请将分页项设置在[1-" + dt.Rows.Count.ToString() + "]之间"; } msg = "共" + page_sum.ToString() + "页," + dt.Rows.Count.ToString() + "条";//page_num :lable DataTable page_table = new DataTable();//记录当前正在操作的是哪个表,全局变量,由查询函数获取 for (int k = 0; k < dt.Columns.Count; k++) { page_table.Columns.Add(dt.Columns[k].ColumnName); } if (dt.Rows.Count != 0 && page_size < dt.Rows.Count) { page_table.Clear(); try //普通页面显示 { page_table.Clear(); for (int i = 0; i < page_size; i++) { page_table.Rows.Add(dt.Rows[i + (pageindex * page_size)].ItemArray); } } catch //最后不足一个页面的显示 { page_table.Clear(); try { for (int s = 0; s < recordCount - (pageindex * page_size); s++) { page_table.Rows.Add(dt.Rows[s + (pageindex * page_size)].ItemArray); } } catch { } } msg += " 当前第" + (pageindex + 1).ToString() + "页"; } dv = page_table.DefaultView; } else { dv = dt.DefaultView; msg = "共1页," + dt.Rows.Count.ToString() + "条"; msg += " 当前第" + (pageindex + 1).ToString() + "页"; } return dv; } else { msg = "没有数据!"; return null; } } Form调用: Code private DataTable GetDicData()//获取所有据 { BLLB_CommunitDIC bcdicBll = new BLLB_CommunitDIC(); if (trvDic.SelectedNode != null) { if (trvDic.SelectedNode.Parent == null) { return null; } else { int areaid = Convert.ToInt32(trvDic.SelectedNode.Tag); return FCT.Common.PublicMethods.ConvertToDataSet(bcdicBll.GetAll(areaid)).Tables[0]; } } else return null; } //根据页索此获取数据 private void InitData(int pageindex) { DataTable dt = GetDicData(); string msg; if (dt != null && dt.Rows.Count > 0) { dgrvDic.AutoGenerateColumns = false; dgrvDic.DataSource = Public.CustomerPager.GetPagerForView(dt, 10, pageindex, out msg); toolStripLabel18.Text = msg; } } Code 分页事件#region 分页事件 private void toolStrip7_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (e.ClickedItem.Tag != null) { this.Cursor = Cursors.WaitCursor; int _currentPageIndex = 1; DataTable dt = GetDicData(); int pagecount = 0; if (dt != null) pagecount = Public.CustomerPager.GetPageCount(dt.Rows.Count, 10); if (toolStripTextBox6.Text != "") { try { _currentPageIndex = Convert.ToInt32(toolStripTextBox6.Text); } catch { _currentPageIndex = 1; } } switch (e.ClickedItem.Tag.ToString()) { case "First": _currentPageIndex = 1; break; case "Prev": _currentPageIndex = _currentPageIndex - 1; break; case "Next": _currentPageIndex = _currentPageIndex + 1; break; case "Last": _currentPageIndex = pagecount; break; default: this.Cursor = Cursors.Default; break; } InitData(_currentPageIndex - 1); if (_currentPageIndex == 1) { toolStripTextBox6.Text = "1"; this.toolStripButton25.Enabled = false; this.toolStripButton26.Enabled = false; this.toolStripButton27.Enabled = true; this.toolStripButton28.Enabled = true; } else { if (_currentPageIndex < pagecount && _currentPageIndex >= 1) { toolStripTextBox6.Text = _currentPageIndex.ToString(); this.toolStripButton25.Enabled = true; this.toolStripButton26.Enabled = true; this.toolStripButton27.Enabled = true; this.toolStripButton28.Enabled = true; } else if (_currentPageIndex == pagecount) { toolStripTextBox6.Text = pagecount.ToString(); this.toolStripButton25.Enabled = true; this.toolStripButton26.Enabled = true; this.toolStripButton27.Enabled = false; this.toolStripButton28.Enabled = false; } else { this.toolStripButton25.Enabled = false; this.toolStripButton26.Enabled = false; this.toolStripButton27.Enabled = false; this.toolStripButton28.Enabled = false; } } this.Cursor = Cursors.Default; } 84 #endregion
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: 这行代码将数据加载到表“sepaDB_SysDataSet.TrueNewChem”。您可以根据需要移动或移除它。 this.trueNewChemTableAdapter.Fill(this.sepaDB_SysDataSet.TrueNewChem); DataRow dr = this.sepaDB_SysDataSet.TrueNewChem.NewRow(); object objSum = this.sepaDB_SysDataSet.TrueNewChem.Compute("Sum(count)", null); dr["count"] = objSum.ToString(); dr["F单位名称"] = "合计:"; this.sepaDB_SysDataSet.TrueNewChem.Rows.Add(dr); trueNewChemBindingSource.Sort = "count desc"; } private void trueNewChemDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { if (e.RowIndex >= trueNewChemDataGridView.Rows.Count - 1) return; DataGridViewRow dgr = trueNewChemDataGridView.Rows[e.RowIndex]; try { //dgr.Cells[0]是当前性别列的索引,用以确定判断哪一列的 if (dgr.Cells[0].Value.ToString() == "合计:") { //定义画笔,使用颜色是深灰。 using (SolidBrush brush = new SolidBrush(Color.Red )) { //利用画笔填充当前行 e.Graphics.FillRectangle(brush, e.RowBounds); //将重新写回当前行。 e.PaintCellsContent(e.ClipBounds); e.Handled = true; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }
VB.NET WinForm,可以通过使用DataGridView控件的ColumnHeadersDefaultCellStyle属性来设置多行复合头部。以下是实现的步骤: 1. 首先,在WinForm窗体拖放一个DataGridView控件,并设置其Dock属性为Fill,以充满整个窗体。 2. 接下来,打开DataGridView控件的编辑器,在Columns选项卡添加所需的列。 3. 然后,在DataGridView控件的Property窗口找到ColumnHeadersDefaultCellStyle属性,并点击其右侧的“...”按钮以打开样式编辑器。 4. 在样式编辑器,可以设置单元格的样式,包括字体、背景颜色、边框样式等。在这个属性窗口,设置行高和列宽以适应需要,并勾选AllowWrap和WrapMode属性以允许文本自动换行。 5. 若要创建多行复合头部,可以在一个单元格添加多个文本。在样式编辑器,选择所需的单元格,并在“单元格”框输入多个文本,每个占一行。 6. 在编辑完样式后,点击OK按钮关闭样式编辑器,然后运行应用程序,就可以看到DataGridView控件的多行复合头部。 需要注意的是,如果需要对多行复合头部进行更复杂的自定义,可以使用DataGridView控件的CellPainting事件来手动绘制头部。在事件处理程序,可以使用Graphics对象来绘制自定义的头部样式,并通过设置EventArgs的Handled属性为True来阻止默认的头部绘制。 综上所述,以上是在VB.NET WinForm使用DataGridView控件实现多行复合头部的步骤和方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值