国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DataGridView 控件分頁

這篇具有很好參考價值的文章主要介紹了DataGridView 控件分頁。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在使用Winform開發(fā)桌面應(yīng)用時,工具箱預(yù)先提供了豐富的基礎(chǔ)控件,利用這些基礎(chǔ)控件可以開展各類項目的開發(fā)。但是或多或少都會出現(xiàn)既有控件無法滿足功能需求的情況,或者在開發(fā)類似項目時,我們希望將具有相同功能的模板封裝成一個標(biāo)準(zhǔn)控件等,在這些場景下,winform自帶的控件就有些乏力了,需要我們自己開發(fā)一些控件。

本篇開篇于DataGridView控件的分頁效果,當(dāng)數(shù)據(jù)量大的時候,分頁是必要的,但是控件本身是沒有分頁功能的,所以需要自己實現(xiàn)。

我不是專業(yè)的控件開發(fā)人員,所以寫下這篇文章作為學(xué)習(xí)過程中的記錄。

前言

.NET提供了豐富的控件創(chuàng)作技術(shù),自定義控件主要分為三類 - Windows Forms Control Development Basics:

  • 復(fù)合控件:將現(xiàn)有控件組合成一個新的控件
  • 擴展控件:在現(xiàn)有控件的基礎(chǔ)上修改原有控件功能或添加新的功能
  • 自定義控件:從頭到尾開發(fā)一個全新的控件。繼承System.Windows.Forms.Control類,添加和重寫基類的屬性、方法和事件。winform的控件都是直接或間接從System.Windows.Forms.Control派生的類,基類Control提供了控件進行可視化所需要的所有功能,包括窗口的句柄、消息路由、鼠標(biāo)和鍵盤事件以及許多其他用戶界面事件。自定義控件是最靈活也最為強大的方法,同時對開發(fā)者的要求也比較高,你需要處理更為底層的Windows消息,需要了解GDI+技術(shù)以及Windows API

由易到難,我們從最簡單的復(fù)合控件一步一步來,自定義控件作為我們的終極目標(biāo)哈??

通過MSND上的 ctlClockLib 示例學(xué)一下怎樣開發(fā)復(fù)合控件以及擴展現(xiàn)有控件:

復(fù)合控件 - 示例

來看看怎樣創(chuàng)建和調(diào)試自定義控件項目,以MSND上的ctlClockLib 中的 ctlClock為例:

  1. 創(chuàng)建Windows 窗體控件庫 DataGridView 控件分頁

  2. 之后其實和開發(fā)Winform項目差不多,在設(shè)計時里拖入想要組合的控件,在后臺代碼實現(xiàn)相應(yīng)的內(nèi)容。具體代碼,不做贅述,和文檔相同。這個教程只要是完成一個可以自定義底色以及時間字體顏色的以及時鐘控件,由一個Label和一個Timer組成,暴露出一個ClockBackColor屬性和ClockBackColor分別控制背景色以及字體顏色:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace ctlClockLib
    {
        public partial class ctlClock : UserControl
        {
            private Color colFColor;
            private Color colBColor;
    
            public Color ClockBackColor
            {
                get => colBColor;
                set
                {
                    colBColor = value;
                    lblDisplay.BackColor = colBColor;
                }
            }
            public Color ClockBackColor
            {
                get => colFColor;
                set
                {
                    colFColor = value;
                    lblDisplay.ForeColor = colFColor;
                }
            }
            public ctlClock()
            {
                InitializeComponent();
            }
            protected virtual void timer1_Tick(object sender, EventArgs e)
            {
                lblDisplay.Text = DateTime.Now.ToLongTimeString();
            }
        }
    }
    
  3. 運行以后是一個類似設(shè)計器的頁面,右側(cè)為控件屬性,左側(cè)為控件內(nèi)容:

    DataGridView 控件分頁

這樣一個簡單的復(fù)合控件 - ctlClock就完成了,怎么在實際項目中使用就和調(diào)用第三方控件是相似的:

  1. 新建一個新的Winform工程:

    DataGridView 控件分頁

  2. 在工具箱新建一個選項卡,然后選擇項添加上面時鐘控件生成的DLL文件,或者直接將文件拖入選項卡中:

? DataGridView 控件分頁

DataGridView 控件分頁

  1. 然后就和正??丶粯佑镁涂梢粤?,這個時鐘控件,你拖入可以發(fā)現(xiàn)他在設(shè)計器里也是會正常走時間的,之后調(diào)整自定義的時鐘控件就可以在使用控件的窗體中顯現(xiàn)出來。

DataGridView 控件分頁

擴展控件 - 示例

上面示例中創(chuàng)建了一個名為ctlClock的時鐘控件,它只有鐘表功能,怎樣讓它帶有報警的功能呢,給ctlClock添加報警功能的過程就是拓展控件的過程。這里需要我們有一些C# 面向?qū)ο?- 繼承的基礎(chǔ),以MSDN上的 ctlAlarmClock為例。

簡單說一下繼承:一個類型派生于一個基類型,它擁有該基類型的所有成員字段和函數(shù)。在實現(xiàn)繼承中,派生類型采用基類型的每個函數(shù)的實現(xiàn)代碼,除非在派生類型的定義中指定重寫某個函數(shù)的實現(xiàn)代碼。一般在需要給現(xiàn)有類型添加功能時使用繼承。

具體編碼就不說了,MSDN上都有,在原有ctlClock基礎(chǔ)上,添加了一個指示報警的Label:lblAlarm,并重寫了ctlClocktimer1_Tick

using System;
using System.Drawing;

namespace ctlClockLib
{
    public partial class ctlAlarmClock : ctlClock
    {
        private DateTime dteAlarmTime;
        private bool blnAlarmSet;
        private bool blnColorTicker;
        public ctlAlarmClock()
        {
            InitializeComponent();
        }

        public DateTime AlarmTime { get => dteAlarmTime; set => dteAlarmTime = value; }
        public bool AlarmSet { get => blnAlarmSet; set => blnAlarmSet = value; }
        protected override void timer1_Tick(object sender, EventArgs e)
        {
            base.timer1_Tick(sender, e);// 基類中的timer1_Tick功能正常運行
            if (AlarmSet == false)
                return;
            else
            {
                if (AlarmTime.Date == DateTime.Now.Date && AlarmTime.Hour ==
                    DateTime.Now.Hour && AlarmTime.Minute == DateTime.Now.Minute)
                {
                    lblAlarm.Visible = true;
                    if (blnColorTicker == false)	// 根據(jù)blnColorTicker交替改變lblAlarm背景顏色
                    {
                        lblAlarm.BackColor = Color.Red;
                        blnColorTicker = true;
                    }
                    else
                    {
                        lblAlarm.BackColor = Color.Blue;
                        blnColorTicker = false;
                    }
                }
                else
                {
                    lblAlarm.Visible = false;
                }
            }
        }
        private void lblAlarm_Click(object sender, EventArgs e)
        {
            AlarmSet = false;
            lblAlarm.Visible = false;
        }
    }
}

項目結(jié)構(gòu):

DataGridView 控件分頁

ctlTestDemo設(shè)計器:

DataGridView 控件分頁

運行ctlTestDemo:

DataGridView 控件分頁

回到正題,有了上面例子的基礎(chǔ),來嘗試一下通過復(fù)合控件實現(xiàn)DataGridView 分頁功能。

SuperGridView

參照 C# datagridview分頁功能 - 沒事寫個Bug - 非自定義控件 做了一些優(yōu)化,可以自定義數(shù)據(jù)源,做了控件大小自適應(yīng)處理(就是通過TableLayout做了下處理),控件名 - SuperGridView:

DataGridView 控件分頁

控件樣式如上圖所示,通過TableLayout做了自適應(yīng)的處理:

DataGridView 控件分頁

暴露一個DataSource屬性用于給DataGridView綁定數(shù)據(jù)源,一個PageSize屬性可以調(diào)整DataGridView每頁顯示的數(shù)據(jù)量,控件代碼:

DataGridView 控件分頁

using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;

namespace cassControl
{
    public partial class SuperGridView : UserControl
    {
        private int pageSize = 30;  // 每頁記錄數(shù)
        private int recordCount = 0;    // 總記錄數(shù)
        private int pageCount = 0;  // 總頁數(shù)
        private int currentPage = 0;    // 當(dāng)前頁數(shù)
        private DataTable originalTable = new DataTable();  // 數(shù)據(jù)源表
        private DataTable schemaTable = new DataTable();  // 虛擬表

        public SuperGridView()
        {
            InitializeComponent();
            InitializeDataGridzview();
        }

        private void InitializeDataGridzview()
        {
            dgv.AutoGenerateColumns = true;
            dgv.AllowUserToAddRows = false;
            dgv.AllowUserToResizeRows = false;
            dgv.ReadOnly = true;
            dgv.RowHeadersVisible = true;
            dgv.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        [Category("DataSource"), Description("指示 DataGridView 控件的數(shù)據(jù)源。")]
        public object DataSource
        {
            get { return OriginalTable; }
            set
            {
                if (value is DataTable dt)
                {
                    OriginalTable = dt;
                    dgv.DataSource = dt;
                    PageSorter();
                }
                else
                {
                    throw new ArgumentException("Only DataTable is supported as DataSource.");
                }
            }
        }
      
        [Category("PageSize"), Description("指示 DataGridView 控件每頁數(shù)據(jù)量。")]
        public int PageSize { get => pageSize; set => pageSize = value; }
        private int RecordCount { get => recordCount; set => recordCount = value; }
        private int PageCount { get => pageCount; set => pageCount = value; }
        private int CurrentPage { get => currentPage; set => currentPage = value; }
        private DataTable OriginalTable { get => originalTable; set => originalTable = value; }
        private DataTable SchemaTable { get => schemaTable; set => schemaTable = value; }

        private void PageSorter()
        {
            RecordCount = OriginalTable.Rows.Count;
            this.lblCount.Text = RecordCount.ToString();

            PageCount = (RecordCount / PageSize);

            if ((RecordCount % PageSize) > 0)
            {
                PageCount++;
            }

            //默認(rèn)第一頁
            CurrentPage = 1;

            LoadPage();
        }

        private void LoadPage()
        {
            if (CurrentPage < 1) CurrentPage = 1;
            if (CurrentPage > PageCount) CurrentPage = PageCount;

            SchemaTable = OriginalTable.Clone();

            int beginRecord;
            int endRecord;

            beginRecord = PageSize * (CurrentPage - 1);
            if (CurrentPage == 1) beginRecord = 0;
            endRecord = PageSize * CurrentPage - 1;
            if (CurrentPage == PageCount) endRecord = RecordCount - 1;

            int startIndex = beginRecord;
            int endIndex = endRecord;
            for (int i = startIndex; i <= endIndex; i++)
            {
                DataRow row = OriginalTable.Rows[i];
                SchemaTable.ImportRow(row);
            }

            dgv.DataSource = SchemaTable;
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            if (CurrentPage == PageCount)
            { return; }
            CurrentPage++;
            LoadPage();
        }

        private void btnBegain_Click(object sender, EventArgs e)
        {
            if (CurrentPage == 1)
            { return; }
            CurrentPage = 1;
            LoadPage();
        }

        private void btnEnd_Click(object sender, EventArgs e)
        {
            if (CurrentPage == PageCount)
            { return; }
            CurrentPage = PageCount;
            LoadPage();
        }

        private void btnPre_Click(object sender, EventArgs e)
        {
            if (CurrentPage == 1)
            { return; }
            CurrentPage--;
            LoadPage();
        }
    }
}

控件功能:

  1. 控件具有自定義的數(shù)據(jù)源綁定功能,通過 DataSource 屬性綁定 DataTable 對象作為數(shù)據(jù)源。
  2. 控件支持分頁顯示,可以按照每頁固定的記錄數(shù)顯示數(shù)據(jù)。
  3. 控件的分頁功能包括跳轉(zhuǎn)到第一頁、上一頁、下一頁、最后一頁,以及顯示總記錄數(shù)等。
  4. 控件中的數(shù)據(jù)表格 (DataGridView) 可以自動生成列,表中內(nèi)容默認(rèn)居中顯示

實機演示 - 也還湊合,試了一下自造了十萬條數(shù)據(jù),但是在十萬條數(shù)據(jù)下可以明顯看到內(nèi)存暴漲,從最初的22MB漲到了60MB??,好在我的應(yīng)用場景下數(shù)據(jù)量不大:

DataGridView 控件分頁

這段代碼只實現(xiàn)了一個簡單的分頁數(shù)據(jù)表格控件,適合處理中小規(guī)模的數(shù)據(jù)。它的主要優(yōu)點是簡化數(shù)據(jù)綁定和提供分頁顯示,但仍有改進空間,尤其在處理大數(shù)據(jù)集和功能擴展方面。如果只是在項目中使用,且數(shù)據(jù)量不大,這個控件可能已經(jīng)足夠。然而,如果需要更多功能和性能優(yōu)化,可能需要進一步開發(fā)和優(yōu)化,比如可以加上頁面,頁碼自動跳轉(zhuǎn)之類的,還有內(nèi)存占用問題等,還有就是在設(shè)計器里不能暴露出來DataGridView 任務(wù)操作選項,需要通過后臺代碼完成數(shù)據(jù)顯示的綁定,我在想是不是可以不直接用DataGridView呢,只用下方的操作欄呢?

PagerControl

用上面的思路試一試組合一個操作欄出來,為了好看一點,這次換成組合CSkin的控件。

樣式和上面幾乎一致,沒有放每頁條數(shù)的配置項,這個打算作為一個屬性放出來:

DataGridView 控件分頁

我的思路是給控件一個數(shù)據(jù)源,用于綁定頁面中的DataGridView,然后獲取到數(shù)據(jù)以后和之前一樣,因為使用場景下數(shù)據(jù)量不是特別大,所以就同樣沿用上面的思路。

這里需要暴露一個配置項用于綁定頁面上的DataGridView需要用到設(shè)計時的一些特性(Attribute),這些設(shè)計時的特性(Attribute)在C#和類似的語言中扮演著非常重要的角色,用于影響控件在設(shè)計時的表現(xiàn)和行為,提供更好的用戶體驗和開發(fā)者便利:

DataGridView 控件分頁

  • Windows 窗體控件中的特性

OK,理想很豐滿,現(xiàn)實很骨感。通過綁定綁定頁面中的DataGridView獲取數(shù)據(jù)會有一個問題,因為我控制分頁的方式是通過給DataGridView更換處理之后的DataSource數(shù)據(jù)表,這就導(dǎo)致有一個問題是我不知道DataGridView什么時候會綁定數(shù)據(jù),解決這個問題我能想到的就是監(jiān)聽數(shù)據(jù)源的變化,也就是通過DataGridViewDataSourceChanged事件,但這就導(dǎo)致我在實現(xiàn)分頁效果的時候也會觸發(fā)該事件,邏輯會陷入一個死循環(huán)里面。。。

換一種方式,清空DataGridView表中數(shù)據(jù)然后一行一行的加Clear()方法又會報錯:

// 假設(shè)已經(jīng)有一個DataGridView控件名為dataGridViewToBind
// 假設(shè)已經(jīng)有一個DataTable名為newDataTable

// 清空表格中的內(nèi)容
dataGridView1.Rows.Clear(); 
dataGridView1.Refresh();

// 添加新的DataTable數(shù)據(jù)
foreach (DataRow row in newDataTable.Rows)
{
    dataGridViewToBind.Rows.Add(row.ItemArray);
}

一通抓耳撓腮之后,我覺得換一種思路:只操作DataGridView上顯示的內(nèi)容,當(dāng)然也是通過更改它的DataSource來完成,獲取DataGridView的數(shù)據(jù)源采用之前的思路,控件給一個數(shù)據(jù)源屬性,每次更改DataGridView的數(shù)據(jù)源的時候也順路操作一下控件的數(shù)據(jù)源,這樣就不用在控件內(nèi)部監(jiān)聽DataGridView數(shù)據(jù)源的變化了,也就不會出現(xiàn)我在操作DataGridView的時候程序陷入死循環(huán)的問題。

All Right。來說說怎么搞的,更之前那個相比有點不一樣,因為是給一個n年前的winform項目做的,所以這里DataGridView改為CSkinSkinDataGridView還有就是數(shù)據(jù)源,程序用的DataTable這里也就用``DataTable了,但是數(shù)據(jù)源那里放的object`類型,可以擴展其他類型數(shù)據(jù):

DataGridView 控件分頁

using CCWin.SkinControl;
using System;
using System.ComponentModel;
using System.Data;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace cassControl
{
    public partial class PagerControl : UserControl
    {
        public PagerControl()
        {
            InitializeComponent();
        }

        #region fields, properties

        private int pageCount;
        private int dataCount;
        private int pageSize = 50;
        private int currentPage;

        private DataTable dataSourceTable;
        private DataTable tempTable;

        private SkinDataGridView dataGridViewToBind;

        [Browsable(true)]
        [Category("PagerControl")]
        [Description("為 PagerControl 綁定 DataGridView 數(shù)據(jù)項")]
        public SkinDataGridView DataGridView
        {
            get { return dataGridViewToBind; }
            set
            {
                dataGridViewToBind = value;
            }
        }

        [Browsable(false)]
        public object DataSource    // 數(shù)據(jù)類型可以擴展
        {
            get { return dataSourceTable; }
            set
            {
                if (value is DataTable dt)
                {
                    dataSourceTable = dt;
                    PageSorter();
                }
                else
                {
                    return;
                }
            }
        }

        [Browsable(false)]
        public int CurrentPage { get => currentPage; set => currentPage = value; }

        [Browsable(false)]
        public int PageCount { get => pageCount; set => pageCount = value; }

        [Browsable(false)]
        public int DataCount { get => dataCount; set => dataCount = value; }

        [Browsable(true)]
        [Category("PagerControl")]
        [Description("設(shè)置每頁顯示的數(shù)據(jù)量")]
        public int PageSize
        {
            get => pageSize;
            set
            {
                if (value <= 0)
                {
                    pageSize = 50;  // 默認(rèn)顯示50條數(shù)據(jù)
                }
                else { pageSize = value; }
            }
        }

        #endregion fields, properties

        #region methods

        private void PageSorter()
        {
            DataCount = dataSourceTable.Rows.Count;
            lblDataCount.Text = DataCount.ToString();
            PageCount = (DataCount / PageSize);
            if ((DataCount % PageSize) > 0)
            {
                PageCount++;
            }
            lblPageCount.Text = PageCount.ToString();
            CurrentPage = 1;
            lblCurrentPage.Text = CurrentPage.ToString();
            SetCtlEnabled(true);
            LoadPage();
        }

        private void LoadPage()
        {
            if (CurrentPage < 1) CurrentPage = 1;
            if (CurrentPage > PageCount) CurrentPage = pageCount;

            tempTable = dataSourceTable.Clone();

            int beginIndex, endIndex;

            if (CurrentPage == 1)
            {
                beginIndex = 0;
            }
            else { beginIndex = PageSize * (CurrentPage - 1); }
            if (CurrentPage == PageCount)
            {
                endIndex = DataCount - 1;
            }
            else { endIndex = PageSize * CurrentPage; }
            lblCurrentPage.Text = CurrentPage.ToString();
            txtTargetPage.Text = CurrentPage.ToString();
            for (int i = beginIndex; i < endIndex; i++)
            {
                DataRow row = dataSourceTable.Rows[i];
                tempTable.ImportRow(row);
            }
            dataGridViewToBind.DataSource = tempTable;
        }

        private void SetCtlEnabled(bool status)
        {
            btnFirstpage.Enabled = status;
            btnNextpage.Enabled = status;
            btnPreviouspage.Enabled = status;
            btnLastpage.Enabled = status;
            txtTargetPage.Enabled = status;
            btnSwitchPage.Enabled = status;
        }

        #endregion methods

        #region events

        private void btnFirstpage_Click(object sender, EventArgs e)
        {
            if (CurrentPage == 1)
            { return; }
            CurrentPage = 1;
            LoadPage();
        }

        private void btnPreviouspage_Click(object sender, EventArgs e)
        {
            if (CurrentPage == 1)
            { return; }
            CurrentPage--;
            LoadPage();
        }

        private void btnNextpage_Click(object sender, EventArgs e)
        {
            if (CurrentPage == PageCount)
            { return; }
            CurrentPage++;
            LoadPage();
        }

        private void btnLastpage_Click(object sender, EventArgs e)
        {
            if (CurrentPage == PageCount)
            { return; }
            CurrentPage = PageCount;
            LoadPage();
        }

        private void btnSwitchPage_Click(object sender, EventArgs e)
        {
            int num = 0;
            int.TryParse(txtTargetPage.Text.Trim(), out num);
            CurrentPage = num;
            LoadPage();
        }

        private void txtTargetPage_KeyPress(object sender, KeyPressEventArgs e)
        {
            string pattern = @"[0-9]";
            Regex regex = new Regex(pattern);
            if (!regex.IsMatch(e.KeyChar.ToString()) && !char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }

        #endregion events
    }
}

DataGridView 控件分頁

客戶端使用:

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(string));
dataTable.Columns.Add("Age1", typeof(string));
								......
dataTable.Columns.Add("Age15", typeof(string));
for (int i = 1; i <= 100000; i++)
{
  DataRow newRow = dataTable.NewRow();
  newRow["ID"] = i;
  newRow["Name"] = "Name_" + i;
  newRow["Age"] = i * 1.2;
  dataTable.Rows.Add(newRow);
}
superGridView1.DataSource = dataTable;
skinDataGridView1.DataSource = dataTable;
pagerControl1.DataSource = dataTable;

DataGridView 控件分頁

大致上就這個樣子,還是有很大的改進空間的??

Demo的代碼上傳到GitHub了,感興趣的友友們可以參考一下:PagerControl

還有一件事,真的很討厭維護N年前老師傅寫的項目,太痛苦了??????

參考

MSDN:

  • MSDN - Developing Custom Windows Forms Controls with the .NET Framework

  • MSDN - Develop Windows Forms controls at design time

技術(shù)博文:

  • Winform控件開發(fā)總結(jié)目錄 - 白話Programing

  • C# Winform開發(fā)以及控件開發(fā)的需要注意的,被人問怕了,都是基礎(chǔ)常識 - DSkin

  • 鋒利的C# - 代碼迷途

  • 淺談Winform控件開發(fā)(一):使用GDI+美化基礎(chǔ)窗口 - __Meow

  • C# datagridview分頁功能 - 沒事寫個Bug - 非自定義控件

  • WinForm輕松實現(xiàn)自定義分頁(轉(zhuǎn)載)

  • WinForm下編寫分頁控件,實現(xiàn)DataGridView的分頁效果 - 牛遷遷文章來源地址http://www.zghlxwxcb.cn/news/detail-599838.html

到了這里,關(guān)于DataGridView 控件分頁的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用雙緩沖技術(shù)解決winform窗體控件卡頓(dataGridView加載數(shù)據(jù)緩慢)

    使用雙緩沖技術(shù)解決winform窗體控件卡頓(dataGridView加載數(shù)據(jù)緩慢)

    在做C/S項目中,做好的窗體出現(xiàn)了頁面加載控件緩慢,放大、縮小窗體之后,窗體加載卡頓,以及數(shù)據(jù)渲染緩慢。 百度介紹:我們看電視時,看到的屏幕稱為OSD層,也就是說,只有在OSD層上顯示圖像我們才能看到?,F(xiàn)在,我需要創(chuàng)建一個虛擬的、看不見但是可以在上面畫圖(

    2024年02月02日
    瀏覽(20)
  • C#Winform中DataGridView控件根據(jù)鼠標(biāo)左右鍵獲取單元格值或者行列

    有多種方法可以獲取單元格的值或者行列,此處選用了兩種方式去獲取分別用了CurrentCell方法和Rows[].Cells[]的方法去獲取行列值 鼠標(biāo)左鍵獲取單獨行列值 此處獲取左鍵行列值的觸發(fā)條件是表格中數(shù)據(jù)變化獲取,對應(yīng)DataGridView事件CellValueChanged。 用方法CurrentCell中的Value,RowIndex

    2024年02月09日
    瀏覽(20)
  • c# 從零到精通 讀取連接數(shù)據(jù)庫-并將數(shù)據(jù)填入dataGridView控件中

    c# 從零到精通 讀取連接數(shù)據(jù)庫-并將數(shù)據(jù)填入dataGridView控件中 using System; using System.Data; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace Test01 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { SqlConnection conn

    2024年02月09日
    瀏覽(29)
  • c# 從零到精通 讀取連接數(shù)據(jù)庫-并將數(shù)據(jù)填入dataGridView控件中,并且獲取所選單元格的值

    c# 從零到精通 讀取連接數(shù)據(jù)庫-并將數(shù)據(jù)填入dataGridView控件中,并且獲取所選單元格的值 using System; using System.Data; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace Test02 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } SqlConnection conn; SqlDataAdapter sd

    2024年02月09日
    瀏覽(22)
  • 雙擊dataGridView控件中的數(shù)據(jù)行,彈出另一個窗體,并將數(shù)據(jù)傳遞到另一個窗體中的方法。實現(xiàn)窗體調(diào)用,并數(shù)據(jù)傳輸

    //實例化學(xué)生明細的窗體 public static frmStudentDetail frmsd; //主窗體雙擊單元格的事件 private void dgvStudent_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)//雙擊單元格的事件 { //通過Serverice類中的方法得到學(xué)生類 Student objectStudent = StudentService.GetStudentInfo(Convert.ToInt32( dgvStudent.Curr

    2024年02月04日
    瀏覽(22)
  • 打印Winform控件實現(xiàn)簡陋版的分頁打印(C#)

    打印Winform控件實現(xiàn)簡陋版的分頁打印(C#)

    本文的代碼可以從這里獲取:winformDemo.rar · 張祥裕/分享的資源名稱 - Gitee.com 作者的水平有限,如有錯誤,望指正。 為了簡單起見,紙張大小,打印機等信息按照默認(rèn)的來,本文的實現(xiàn)方案是:打印Panel中的控件信息,循環(huán)進行打印,打印完一張,把信息重新填充到對應(yīng)的控

    2024年02月14日
    瀏覽(17)
  • 在Winform分頁控件中集成保存用戶列表顯示字段及寬度調(diào)整設(shè)置

    在Winform分頁控件中集成保存用戶列表顯示字段及寬度調(diào)整設(shè)置

    在Winform的分頁控件里面,我們提供了很多豐富的功能,如常規(guī)分頁,中文轉(zhuǎn)義、導(dǎo)出Excel、導(dǎo)出PDF等,基于DevExpress的樣式的分頁控件,我們在其上面做了不少封裝,以便更好的使用,其中就包括集成保存用戶列表顯示字段及寬度調(diào)整設(shè)置。本篇隨筆介紹這個實現(xiàn)的過程,通過

    2024年02月03日
    瀏覽(19)
  • MFC第二十四天 使用GDI對象畫筆和畫刷來開發(fā)控件(分頁控件選擇態(tài)的算法分析、使用CToolTipCtrl開發(fā)動靜態(tài)提示)

    MFC第二十四天 使用GDI對象畫筆和畫刷來開發(fā)控件(分頁控件選擇態(tài)的算法分析、使用CToolTipCtrl開發(fā)動靜態(tài)提示)

    CMainDlg.h CMainDlg.cpp CLadderCtrl.h CLadderCtrl.cpp CMainDlg.h CMainDlg.cpp CLadderCtrl.h CLadderCtrl.cpp: 實現(xiàn)文件 本次只添加了與靜態(tài)提示不同之處的代碼 CMainDlg.h CMainDlg.cpp 設(shè)置動態(tài)文字的函數(shù) CLadderCtrl.h CLadderCtrl.cpp MouseMove 進入任意控件都不會理你 除非回到主窗口范圍內(nèi) OnSetCursor 不論在什么控

    2024年02月15日
    瀏覽(30)
  • C#使用DataGridView模擬繪圖

    C#使用DataGridView模擬繪圖

    接到一個需求,繪制一個水管線的圖片,這種管線可以有12種分段方法,最后將這12種分段方法合并后在一條水管線上展示,要求: ⒈支持分段的屬性展示; ⒉要求每個分段都能清晰展示,分段數(shù)在0(沒有分段)~100之間,水管線長度不定; 3、每個分段的屬性都有值,可以更

    2024年02月16日
    瀏覽(21)
  • C# DataGridView數(shù)據(jù)導(dǎo)出Excel文件

    C# DataGridView數(shù)據(jù)導(dǎo)出Excel文件

    博主在做項目的時候需要把數(shù)據(jù)庫的數(shù)據(jù)用DataGridView展示,然后把展示的數(shù)據(jù)導(dǎo)出為Excel文件,很多時候我們做項目都會有一個下載文件的按鈕,我們需要用微軟的的接口,Microsoft.Office.Interop.Excel,我們需要導(dǎo)入這個引用對DataGridView數(shù)據(jù)進行處理,利用Microsoft.Office.Interop.Exc

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包