校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > DataGridView多維表頭的實現方法

DataGridView多維表頭的實現方法

熱門標簽:怎樣在地圖標注消火栓圖形 廈門四川外呼系統 地圖標注位置多的錢 濟源人工智能電話機器人價格 內蒙古智能電銷機器人哪家強 山東防封電銷卡辦理套餐 泰州手機外呼系統軟件 百度地圖標注點擊事件 杭州智能電話機器人

背景

對于.NET 原本提供的DataGridView控件,制作成如下形式的表格是毫無壓力的。

但是如果把表格改了一下,變成如下形式

傳統的DataGridView就做不到了,如果擴展一下還是行的,有不少網友也擴展了DataGridView控件,不過有些也只能制作出二維的表頭。或者使用第三方的控件,之前也用過DevExpress的BoundGridView。不過在沒有可使用的第三方控件的情況下,做到下面的效果,就有點麻煩了。

那得自己擴展了,不過最后還是用了一個控件庫的報表控件,Telerik的Reporting。不過我自己還是擴展了DataGridView,使之能制作出上面的報表。

準備

學習了一些網友的代碼,原來制作這個多維表頭都是利用GDI+對DataGirdView的表頭進行重繪。

用到的方法包括

Graphics.FillRectangle //填充一個矩形

Graphics.DrawLine //畫一條線

Graphics.DrawString  //寫字符串

此外為了方便組織表頭,本人還定義了一個表頭的數據結構 HeaderItem 和 HeaderCollection 分別作為每個表頭單元格的數據實體和整個表頭的集合。

HeaderItem的定義如下

復制代碼 代碼如下:

public class HeaderItem
     {
         private int _startX;//起始橫坐標
         private int _startY;//起始縱坐標
         private int _endX; //終止橫坐標
         private int _endY; //終止縱坐標
         private bool _baseHeader; //是否基礎表頭

         public HeaderItem(int startX, int endX, int startY, int endY, string content)
         {
             this._endX = endX;
             this._endY = endY;
             this._startX = startX;
             this._startY = startY;
             this.Content = content;
         }

         public HeaderItem(int x, int y, string content):this(x,x,y,y,content)
         {

         }

         public HeaderItem()
         {

         }

         public static HeaderItem CreateBaseHeader(int x,int y,string content)
         {
             HeaderItem header = new HeaderItem();
             header._endX= header._startX = x;
             header._endY= header._startY = y;
             header._baseHeader = true;
             header.Content = content;
             return header;
         }

         public int StartX
         {
             get { return _startX; }
             set
             {
                 if (value > _endX)
                 {
                     _startX = _endX;
                     return;
                 }
                 if (value 0) _startX = 0;
                 else _startX = value;
             }
         }

         public int StartY
         {
             get { return _startY; }
             set
             {
                 if (_baseHeader)
                 {
                     _startY = 0;
                     return;
                 }
                 if (value > _endY)
                 {
                     _startY = _endY;
                     return;
                 }
                 if (value 0) _startY = 0;
                 else _startY = value;
             }
         }

         public int EndX
         {
             get { return _endX; }
             set
             {
                 if (_baseHeader)
                 {
                     _endX = _startX;
                     return;
                 }
                 if (value _startX)
                 {
                     _endX = _startX;
                     return;
                 }
                 _endX = value;
             }
         }

         public int EndY
         {
             get { return _endY; }
             set
             {
                 if (value _startY)
                 {
                     _endY = _startY;
                     return;
                 }
                 _endY = value;
             }
         }

         public bool IsBaseHeader
         {get{ return _baseHeader;} }

         public string Content { get; set; }
     }

設計思想是利用數學的直角坐標系,給每個表頭單元格定位并劃定其大小。與計算機顯示的坐標定位不同,這里的原點是跟數學的一樣放在左下角,X軸正方向是水平向右,Y軸正方向是垂直向上。如下圖所示

之所以要對GridView中原始的列頭進行特別處理,是因為這里的起止坐標和終止坐標都可以設置,而原始列頭的起始縱坐標(StartY)只能是0,終止橫坐標(EndX)必須與起始橫坐標(StartY)相等。

另外所有列頭單元格的集合HeaderCollection的定義如下

復制代碼 代碼如下:

public class HeaderCollection
     {
         private ListHeaderItem> _headerList;
         private bool _iniLock;

         public DataGridViewColumnCollection BindCollection{get;set;}

         public HeaderCollection(DataGridViewColumnCollection cols)
         {
             _headerList = new ListHeaderItem>();
             BindCollection=cols;
             _iniLock = false;
         }

         public int GetHeaderLevels()
         {
             int max = 0;
             foreach (HeaderItem item in _headerList)
                 if (item.EndY > max)
                     max = item.EndY;

             return max;
         }

         public ListHeaderItem> GetBaseHeaders()
         {
             ListHeaderItem> list = new ListHeaderItem>();
             foreach (HeaderItem item in _headerList)
                 if (item.IsBaseHeader) list.Add(item);
             return list;
         }

         public HeaderItem GetHeaderByLocation(int x, int y)
         {
             if (!_iniLock) InitHeader();
             HeaderItem result=null;
             ListHeaderItem> temp = new ListHeaderItem>();
             foreach (HeaderItem item in _headerList)
                 if (item.StartX = x item.EndX >= x)
                     temp.Add(item);
             foreach (HeaderItem item in temp)
                 if (item.StartY = y item.EndY >= y)
                     result = item;

             return result;
         }

         public IEnumerator GetHeaderEnumer()
         {
             return _headerList.GetEnumerator();
         }

         public void AddHeader(HeaderItem header)
         {
             this._headerList.Add(header);
         }

         public void AddHeader(int startX, int endX, int startY, int endY, string content)
         {
             this._headerList.Add(new HeaderItem(startX,endX,startY,endY,content));
         }

         public void AddHeader(int x, int y, string content)
         {
             this._headerList.Add(new HeaderItem(x, y, content));
         }

         public void RemoveHeader(HeaderItem header)
         {
             this._headerList.Remove(header);
         }

         public void RemoveHeader(int x, int y)
         {
            HeaderItem header= GetHeaderByLocation(x, y);
            if (header != null) RemoveHeader(header);
         }

         private void InitHeader()
         {
             _iniLock = true;
             for (int i = 0; i this.BindCollection.Count; i++)
                 if(this.GetHeaderByLocation(i,0)==null)
                 this._headerList.Add(HeaderItem.CreateBaseHeader(i,0 , this.BindCollection[i].HeaderText));
             _iniLock = false;
         }
     }

這里仿照了.NET Frameword的Collection那樣定義了Add方法和Remove方法,此外說明一下那個 GetHeaderByLocation 方法,這個方法可以通過給定的坐標獲取那個坐標的HeaderItem。這個坐標是忽略了整個表頭合并單元格的情況,例如

上面這幅圖,如果輸入0,0 返回的是灰色區域,輸入2,1 或3,2 或 5,1返回的都是橙色的區域。

擴展控件

到真正擴展控件了,最核心的是重寫 OnCellPainting 方法,這個其實是與表格單元格重繪時觸發事件綁定的方法,通過參數 DataGridViewCellPaintingEventArgs 的 ColumnIndex 和 RowIndex 屬性可以知道當前重繪的是哪個單元格,于是就通過HeaderCollection獲取要繪制的表頭單元格的信息進行重繪,對已經重繪的單元格會進行標記,以防重復繪制。

復制代碼 代碼如下:

protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
         {
             if (e.ColumnIndex == -1 || e.RowIndex != -1)
             {
                 base.OnCellPainting(e);
                 return;
             }
             int lev=this.Headers.GetHeaderLevels();
             this.ColumnHeadersHeight = (lev + 1) * _baseColumnHeadHeight;
             for (int i = 0; i = lev; i++)
             {
                 HeaderItem tempHeader= this.Headers.GetHeaderByLocation(e.ColumnIndex, i);
                 if (tempHeader==null|| i != tempHeader.EndY || e.ColumnIndex != tempHeader.StartX) continue;
                 DrawHeader(tempHeader, e);
             }
             e.Handled = true;
         }

上面的代碼中,最初是先判斷當前要重繪的單元格是不是表頭部分,如果不是則調用原本的OnCellPainting方法。 e.Handled=true; 比較關鍵,有了這句代碼,重繪才能生效。

繪制單元格的過程封裝在方法DrawHeader里面

復制代碼 代碼如下:

private void DrawHeader(HeaderItem item,DataGridViewCellPaintingEventArgs e)
         {
             if (this.ColumnHeadersHeightSizeMode != DataGridViewColumnHeadersHeightSizeMode.DisableResizing)
                 this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
             int lev=this.Headers.GetHeaderLevels();
             lev=(lev-item.EndY)*_baseColumnHeadHeight;

             SolidBrush backgroundBrush = new SolidBrush(e.CellStyle.BackColor);
             SolidBrush lineBrush = new SolidBrush(this.GridColor);
             Pen linePen = new Pen(lineBrush);
             StringFormat foramt = new StringFormat();
             foramt.Alignment = StringAlignment.Center;
             foramt.LineAlignment = StringAlignment.Center;

             Rectangle headRec = new Rectangle(e.CellBounds.Left, lev, ComputeWidth(item.StartX, item.EndX)-1, ComputeHeight(item.StartY, item.EndY)-1);
             e.Graphics.FillRectangle(backgroundBrush, headRec);
             e.Graphics.DrawLine(linePen, headRec.Left, headRec.Bottom, headRec.Right, headRec.Bottom);
             e.Graphics.DrawLine(linePen, headRec.Right, headRec.Top, headRec.Right, headRec.Bottom);
             e.Graphics.DrawString(item.Content, this.ColumnHeadersDefaultCellStyle.Font, Brushes.Black,headRec, foramt);
         }

填充矩形時,記得要給矩形的常和寬減去一個像素,這樣才不會與相鄰的矩形重疊區域導致矩形的邊線顯示不出來。還有這里的要設置 ColumnHeadersHeightSizeMode 屬性,如果不把它設成 DisableResizing ,那么表頭的高度是改變不了的,這樣即使設置了二維,三維,n維,最終只是一維。

這里用到的一些輔助方法如下,分別是通過坐標計算出高度和寬度。

復制代碼 代碼如下:

private int ComputeWidth(int startX, int endX)
         {
             int width = 0;
             for (int i = startX; i = endX; i++)
                 width+= this.Columns[i].Width;
             return width;
         }

         private int ComputeHeight(int startY, int endY)
         {
             return _baseColumnHeadHeight * (endY - startY+1);
         }

給一段使用的實例代碼,這里要預先給DataGridView每一列設好綁定的字段,否則自動添加的列是做不出效果來的。

復制代碼 代碼如下:

HeaderItem item= this.boundGridView1.Headers.GetHeaderByLocation(0, 0);
             item.EndY = 2;
             item = this.boundGridView1.Headers.GetHeaderByLocation(9,0 );
             item.EndY = 2;
             item = this.boundGridView1.Headers.GetHeaderByLocation(10, 0);
             item.EndY = 2;
             item = this.boundGridView1.Headers.GetHeaderByLocation(11, 0);
             item.EndY = 2;

             this.boundGridView1.Headers.AddHeader(1, 2, 1, 1, "語文");
             this.boundGridView1.Headers.AddHeader(3, 4, 1, 1, "數學");
             this.boundGridView1.Headers.AddHeader(5, 6, 1, 1, "英語");
             this.boundGridView1.Headers.AddHeader(7, 8, 1, 1, "X科");
             this.boundGridView1.Headers.AddHeader(1, 8, 2, 2, "成績");

效果圖如下所示

 

總的來說自我感覺有點小題大做,但想不出有什么更好的辦法,各位如果覺得以上說的有什么不好的,歡迎拍磚;如果發現以上有什么說錯了,懇請批評指正;如果覺得好的,請支持一下。謝謝!最后附上整個控件的源碼
控件的完整代碼

復制代碼 代碼如下:


     public class BoundGridView : DataGridView
     {
         private int _baseColumnHeadHeight;

         public BoundGridView():base()
         {
             this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
             _baseColumnHeadHeight = this.ColumnHeadersHeight;
             this.Headers = new HeaderCollection(this.Columns);
         }

         public HeaderCollection Headers{ get;private set; }

         protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
         {
             if (e.ColumnIndex == -1 || e.RowIndex != -1)
             {
                 base.OnCellPainting(e);
                 return;
             }
             int lev=this.Headers.GetHeaderLevels();
             this.ColumnHeadersHeight = (lev + 1) * _baseColumnHeadHeight;
             for (int i = 0; i = lev; i++)
             {
                 HeaderItem tempHeader= this.Headers.GetHeaderByLocation(e.ColumnIndex, i);
                 if (tempHeader==null|| i != tempHeader.EndY || e.ColumnIndex != tempHeader.StartX) continue;
                 DrawHeader(tempHeader, e);
             }
             e.Handled = true;
         }

         private int ComputeWidth(int startX, int endX)
         {
             int width = 0;
             for (int i = startX; i = endX; i++)
                 width+= this.Columns[i].Width;
             return width;
         }

         private int ComputeHeight(int startY, int endY)
         {
             return _baseColumnHeadHeight * (endY - startY+1);
         }

         private void DrawHeader(HeaderItem item,DataGridViewCellPaintingEventArgs e)
         {
             if (this.ColumnHeadersHeightSizeMode != DataGridViewColumnHeadersHeightSizeMode.DisableResizing)
                 this.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
             int lev=this.Headers.GetHeaderLevels();
             lev=(lev-item.EndY)*_baseColumnHeadHeight;

             SolidBrush backgroundBrush = new SolidBrush(e.CellStyle.BackColor);
             SolidBrush lineBrush = new SolidBrush(this.GridColor);
             Pen linePen = new Pen(lineBrush);
             StringFormat foramt = new StringFormat();
             foramt.Alignment = StringAlignment.Center;
             foramt.LineAlignment = StringAlignment.Center;

             Rectangle headRec = new Rectangle(e.CellBounds.Left, lev, ComputeWidth(item.StartX, item.EndX)-1, ComputeHeight(item.StartY, item.EndY)-1);
             e.Graphics.FillRectangle(backgroundBrush, headRec);
             e.Graphics.DrawLine(linePen, headRec.Left, headRec.Bottom, headRec.Right, headRec.Bottom);
             e.Graphics.DrawLine(linePen, headRec.Right, headRec.Top, headRec.Right, headRec.Bottom);
             e.Graphics.DrawString(item.Content, this.ColumnHeadersDefaultCellStyle.Font, Brushes.Black,headRec, foramt);
         }
     }

     public class HeaderItem
     {
         private int _startX;
         private int _startY;
         private int _endX;
         private int _endY;
         private bool _baseHeader;

         public HeaderItem(int startX, int endX, int startY, int endY, string content)
         {
             this._endX = endX;
             this._endY = endY;
             this._startX = startX;
             this._startY = startY;
             this.Content = content;
         }

         public HeaderItem(int x, int y, string content):this(x,x,y,y,content)
         {

         }

         public HeaderItem()
         {

         }

         public static HeaderItem CreateBaseHeader(int x,int y,string content)
         {
             HeaderItem header = new HeaderItem();
             header._endX= header._startX = x;
             header._endY= header._startY = y;
             header._baseHeader = true;
             header.Content = content;
             return header;
         }

         public int StartX
         {
             get { return _startX; }
             set
             {
                 if (value > _endX)
                 {
                     _startX = _endX;
                     return;
                 }
                 if (value 0) _startX = 0;
                 else _startX = value;
             }
         }

         public int StartY
         {
             get { return _startY; }
             set
             {
                 if (_baseHeader)
                 {
                     _startY = 0;
                     return;
                 }
                 if (value > _endY)
                 {
                     _startY = _endY;
                     return;
                 }
                 if (value 0) _startY = 0;
                 else _startY = value;
             }
         }

         public int EndX
         {
             get { return _endX; }
             set
             {
                 if (_baseHeader)
                 {
                     _endX = _startX;
                     return;
                 }
                 if (value _startX)
                 {
                     _endX = _startX;
                     return;
                 }
                 _endX = value;
             }
         }

         public int EndY
         {
             get { return _endY; }
             set
             {
                 if (value _startY)
                 {
                     _endY = _startY;
                     return;
                 }
                 _endY = value;
             }
         }

         public bool IsBaseHeader
         {get{ return _baseHeader;} }

         public string Content { get; set; }
     }

     public class HeaderCollection
     {
         private ListHeaderItem> _headerList;
         private bool _iniLock;

         public DataGridViewColumnCollection BindCollection{get;set;}

         public HeaderCollection(DataGridViewColumnCollection cols)
         {
             _headerList = new ListHeaderItem>();
             BindCollection=cols;
             _iniLock = false;
         }

         public int GetHeaderLevels()
         {
             int max = 0;
             foreach (HeaderItem item in _headerList)
                 if (item.EndY > max)
                     max = item.EndY;

             return max;
         }

         public ListHeaderItem> GetBaseHeaders()
         {
             ListHeaderItem> list = new ListHeaderItem>();
             foreach (HeaderItem item in _headerList)
                 if (item.IsBaseHeader) list.Add(item);
             return list;
         }

         public HeaderItem GetHeaderByLocation(int x, int y)
         {
             if (!_iniLock) InitHeader();
             HeaderItem result=null;
             ListHeaderItem> temp = new ListHeaderItem>();
             foreach (HeaderItem item in _headerList)
                 if (item.StartX = x item.EndX >= x)
                     temp.Add(item);
             foreach (HeaderItem item in temp)
                 if (item.StartY = y item.EndY >= y)
                     result = item;

             return result;
         }

         public IEnumerator GetHeaderEnumer()
         {
             return _headerList.GetEnumerator();
         }

         public void AddHeader(HeaderItem header)
         {
             this._headerList.Add(header);
         }

         public void AddHeader(int startX, int endX, int startY, int endY, string content)
         {
             this._headerList.Add(new HeaderItem(startX,endX,startY,endY,content));
         }

         public void AddHeader(int x, int y, string content)
         {
             this._headerList.Add(new HeaderItem(x, y, content));
         }

         public void RemoveHeader(HeaderItem header)
         {
             this._headerList.Remove(header);
         }

         public void RemoveHeader(int x, int y)
         {
            HeaderItem header= GetHeaderByLocation(x, y);
            if (header != null) RemoveHeader(header);
         }

         private void InitHeader()
         {
             _iniLock = true;
             for (int i = 0; i this.BindCollection.Count; i++)
                 if(this.GetHeaderByLocation(i,0)==null)
                 this._headerList.Add(HeaderItem.CreateBaseHeader(i,0 , this.BindCollection[i].HeaderText));
             _iniLock = false;
         }
     }

您可能感興趣的文章:
  • asp.net DataGridView導出到Excel的三個方法[親測]
  • DataGridView自動調整行高和行寬
  • DataGridView中綁定DataTable數據及相關操作實現代碼
  • C# DataGridView添加新行的2個方法
  • c#讀取xml文件到datagridview實例
  • WinForm中DataGridView添加,刪除,修改操作具體方法
  • c#利用Excel直接讀取數據到DataGridView
  • C# DatagridView常用操作匯總
  • Winform在DataGridView中顯示圖片
  • Winform讓DataGridView左側顯示圖片

標簽:朔州 朝陽 臺州 百色 洛陽 周口 新鄉 喀什

巨人網絡通訊聲明:本文標題《DataGridView多維表頭的實現方法》,本文關鍵詞  DataGridView,多維,表頭,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《DataGridView多維表頭的實現方法》相關的同類信息!
  • 本頁收集關于DataGridView多維表頭的實現方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91丨porny丨蝌蚪视频| 欧美日韩你懂得| 欧美性xxxxxx少妇| 欧美激情综合在线| 蜜桃一区二区三区四区| 97se亚洲国产综合自在线不卡| 欧美一区二区三区免费大片| 中文字幕一区二区不卡| 三级久久三级久久| 豆国产96在线|亚洲| 精品视频一区 二区 三区| 中文字幕亚洲电影| 国产精品影视在线观看| 欧美一区二区黄色| 亚洲韩国一区二区三区| 盗摄精品av一区二区三区| 91精品国产综合久久国产大片| 国产精品午夜春色av| 美国十次综合导航| 精品视频123区在线观看| 亚洲欧洲一区二区在线播放| 欧洲一区在线观看| 久久色.com| 国产亚洲精品aa| 国产一区在线不卡| 欧美美女直播网站| 亚洲成av人片一区二区三区| 91网站最新网址| 欧美国产日韩在线观看| 成人一级片网址| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩国产一级| 亚洲精品写真福利| 色综合久久中文字幕| 亚洲日本免费电影| 91无套直看片红桃| 亚洲制服丝袜av| 91捆绑美女网站| 一区二区视频在线| 色婷婷香蕉在线一区二区| 亚洲激情自拍视频| 在线观看亚洲专区| 午夜久久久久久电影| 欧美精品在线一区二区三区| 日本伊人色综合网| 精品免费国产二区三区| 国产成人在线免费| 亚洲欧美一区二区三区国产精品| 在线亚洲欧美专区二区| 午夜精品123| 久久新电视剧免费观看| 处破女av一区二区| 一区二区三区在线看| 91精品国产综合久久久蜜臀粉嫩| 韩日欧美一区二区三区| 国产日韩欧美精品电影三级在线| 99国产欧美另类久久久精品| 亚洲国产精品久久不卡毛片| 欧美一区二区国产| 成人av免费网站| 亚洲成人免费看| 久久久久97国产精华液好用吗| 97se亚洲国产综合自在线观| 亚洲国产视频a| 91精品国产丝袜白色高跟鞋| 天天综合色天天| 国产欧美一区二区精品婷婷| 欧美亚洲国产bt| 国产在线精品国自产拍免费| 亚洲日穴在线视频| 日韩精品一区二区在线| 色综合天天性综合| 久久99国产精品久久| 亚洲欧洲韩国日本视频| 制服.丝袜.亚洲.中文.综合| 丁香激情综合五月| 日韩国产精品久久久久久亚洲| 久久精品水蜜桃av综合天堂| 在线欧美小视频| 国产久卡久卡久卡久卡视频精品| 亚洲日本一区二区| 久久久久久久精| 欧美日韩aaaaaa| 99久久精品免费看国产免费软件| 蜜桃视频在线一区| 一区二区免费视频| 中文字幕二三区不卡| 欧美成va人片在线观看| 色综合久久久久久久久久久| 美女视频黄免费的久久| 亚洲人成网站精品片在线观看| 日韩免费高清视频| 欧美三级韩国三级日本三斤| 99久久综合色| 国产a视频精品免费观看| 美女诱惑一区二区| 午夜日韩在线电影| 亚洲高清视频的网址| 1024成人网色www| 国产精品日日摸夜夜摸av| 久久亚洲精品小早川怜子| 欧美一区二区三区四区五区 | 91美女片黄在线观看91美女| 精品无人区卡一卡二卡三乱码免费卡 | 日韩一区二区高清| 日本伦理一区二区| 99re热这里只有精品视频| 国产一区二区三区蝌蚪| 久久99精品一区二区三区| 秋霞影院一区二区| 热久久国产精品| 日本成人中文字幕| 日韩1区2区3区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品99久久久久久似苏梦涵| 免费在线视频一区| 久久se精品一区二区| 奇米亚洲午夜久久精品| 日韩国产欧美在线视频| 午夜欧美一区二区三区在线播放| 亚洲国产美女搞黄色| 亚洲最新视频在线播放| 亚洲最色的网站| 日韩一区欧美二区| 免费在线看成人av| 国产一区二区0| 成人激情文学综合网| 色婷婷久久久亚洲一区二区三区| 在线欧美日韩国产| 欧美军同video69gay| 日韩一区二区电影网| 精品国产免费一区二区三区香蕉| 欧美精品一区二区蜜臀亚洲| 国产色产综合色产在线视频| 国产精品高潮呻吟久久| 日韩美女精品在线| 亚洲高清免费视频| 久久国产精品免费| a在线播放不卡| 欧美性欧美巨大黑白大战| 欧美女孩性生活视频| 欧美变态口味重另类| 精品国产乱码久久久久久浪潮| xf在线a精品一区二区视频网站| 国产午夜亚洲精品羞羞网站| 成人欧美一区二区三区| 亚洲一区在线电影| 紧缚捆绑精品一区二区| 91香蕉视频黄| 日韩女优毛片在线| 中文字幕一区二区三区不卡| 亚洲国产视频a| 国产成人高清视频| 欧美日韩一区中文字幕| 精品国产成人系列| 亚洲精品伦理在线| 久久99精品久久久久久| 日本高清视频一区二区| 欧美成人猛片aaaaaaa| 久久久国产一区二区三区四区小说| 最新日韩在线视频| 图片区小说区区亚洲影院| 麻豆91小视频| 成人激情小说网站| 91精品国产免费久久综合| 精品国产伦一区二区三区观看方式 | 水野朝阳av一区二区三区| 国产成人在线视频网站| 91麻豆精品国产无毒不卡在线观看 | 99久久婷婷国产综合精品电影| 91精品国产免费| 一区二区三区中文字幕电影| 国产一区二区电影| 欧美丰满一区二区免费视频| 国产精品视频一二三| 蜜臀国产一区二区三区在线播放| 91老师国产黑色丝袜在线| xnxx国产精品| 麻豆国产欧美日韩综合精品二区| 不卡视频在线观看| 久久伊人蜜桃av一区二区| 亚洲成人自拍偷拍| 99精品视频在线播放观看| 国产农村妇女毛片精品久久麻豆| 日本va欧美va瓶| 欧美日韩国产a| 亚洲一区二区欧美日韩 | 国产传媒日韩欧美成人| 777a∨成人精品桃花网| 亚洲色图视频网| 国产高清久久久| 精品捆绑美女sm三区| 日精品一区二区| 欧美亚洲综合一区| 亚洲电影一级黄| 欧美久久久久久久久中文字幕| 一区二区三区四区乱视频| 91视频91自| 亚洲三级电影全部在线观看高清| av电影天堂一区二区在线观看|