




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GridCtrlEx控件FAQ目录GridCtrlEx控件FAQ11. 一个固定用法12. 可以控制单元格是否可以编辑33. 在选定一个单元格时,选择整行34. 说明添加固定列头和固定行头的方法35. 说明填写表格内容的方法56. 在选定一行时有响应函数67. 由双击的响应函数68. 由响应右键点击的函数69. 可以方便的删除和添加固定列头710.可以设置、删除、添加固定行头711.可以在第一个单元格中加入Check控件812.可设表格的背景和字体,可设单元格的颜色和字体813.可以方便的添加或者删除一行914.可以由程序选定某一行915.可以由程序自动滚动到某一行,显示在用户面前1016.说明添加排序功能的方法1017.说明在单元格中添加或者改变图形的方法1118.遍历所有的选中行的方法1119.设置控件允许单选或者多选的方法1320.设置不要焦点和焦点外框的方法1321.CGridCtrl的扩展131. 一个固定用法一个常用的用法是将CridCtrl当做ListCtrl那样的用,同时又增加了即时编辑的功能:以下假设在一个Dlg增加一个GridCtrl的控件:我们可以按以下步骤进行:第一步:表格控件加到工程中去可以有两种方法:可以使用controls panel中的custom control添加,添加后如下设置:也可以用菜单ViewResource Symbol添加一个ID号(适用于Create出来的GridCtrl)第二步:在Dlg的头文件中加入CGridCtrl m_Grid;第三步:Create控件(如果是用controls panel中的custom control添加的可以跳过)在Dlg的OnCreate函数中添加m_Grid.Create()代码第四步:创始化控件 在DoDataExchange中添加DDX_GridControl(pDX, IDC_GRID, m_Grid);在Dlg的OnInitialDialog中添加如下代码:/设置控件类似于ListCtrl的表现m_Grid.SetListMode(TRUE);/设置控件颜色,这里GetDefaultCell的两个参数分别表示是否是固定行或者是固定列。如果不设定,缺省的颜色为白色。 m_Grid.GetDefaultCell(FALSE, FALSE)-SetBackClr(Color);/设置控件的固定行为一行,一般是必须的m_Grid.SetFixedRowCount(1);/设置控件的固定行或者固定列不能被选中m_Grid.SetFixedColumnSelection(FALSE);m_Grid.SetFixedRowSelection(FALSE);/设置控件是否允许隐藏行或者列m_Grid.EnableColumnHide(FALSE);m_Grid.EnableRowHide(FALSE);/设置控件是否允许编辑m_Grid.SetEditable(FALSE);/设置控件是否允许选择m_Grid.EnableSelection(TRUE);/设置控件是否允许点击表头排序m_Grid.SetHeaderSort(TRUE);/设置控件是否允许多选或者单选m_Grid.SetSingleRowSelection(TRUE);m_Grid.SetSingleColSelection(TRUE);/设置控件的初始行数和列数m_Grid.SetRowCount(1);m_Grid.SetColumnCount(4);/设置控件是否允许自动调整行列大小m_Grid.SetRowResize(FALSE);m_Grid.SetColumnResize(FALSE);/设置控件不要焦点和焦点外框m_Grid.SetTrackFocusCell(FALSE);m_Grid.SetFrameFocusCell(FALSE);第五步:设置控件的内容 强烈建议添加以下Dlg的两个成员函数:void FillColumn();/具体内容见4void FillItem();/具体内容见5第六步:设置控件的响应具体可见6、7、8其它在使用过程中经常需要由程式设定选中行,请始终连续使用以下两个语句:m_Grid.SetSelectedRange(nRow,0, nRow,m_Grid.GetColumnCount()-1)m_Grid.EnsureVisible(nRow, 0);其中nRow为要选中的那一行,强烈建议不要将这两句语句放在FillItem()中,这样会导致不灵活2. 可以控制单元格是否可以编辑l 可以设定整张表格为只读void CGridCtrl:SetEditable(BOOL bEditable = TRUE)参数设为FALSE,则整张表格为只读。l 也可以设定某个单元格为只读BOOL CGridCtrl:SetItemState(int nRow, int nCol, UINT state)一般需配合使用UINT CGridCtrl:GetItemState(int nRow, int nCol) const比如将单元格(1,1)设为只读CGridCtrlObject.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY);将单元格(1,1)设为正常CGridCtrlObject.SetItemState(1,1, m_Grid.GetItemState(1,1) & GVIS_READONLY);单元格可用的状态常量GVIS_FOCUSED / Cell has focusGVIS_SELECTED / Cell is selectedGVIS_DROPHILITED / Cell is drop highlightedGVIS_READONLY / Cell is read-only and cannot be editedGVIS_FIXED / Cell is fixedGVIS_FIXEDROW / Cell is part of a fixed rowGVIS_FIXEDCOL / Cell is part of a fixed columnGVIS_MODIFIED / Cell has been modified3. 在选定一个单元格时,选择整行void CGridCtrl:SetListMode(BOOL bEnableListMode = TRUE)先设定表格为ListMode 4. 说明添加固定列头和固定行头的方法CGridCtrlObject.SetFixedColumnCount(NumberFixCol);CGridCtrlObject.SetFixedRowCount(NumberFixRow);CGridCtrlObject.SetFixedColumnSelection(FALSE);CGridCtrlObject.SetFixedRowSelection(FALSE);添加固定表头的方法如下:m_Grid.SetFixedRowCount(1);/设定固定行数为1行const int nColumnNum=3;m_Grid.SetColumnCount(nColumnNum);int nWidthnColumnNum;nWidth0=60;nWidth1=120;nWidth2=120;for(int i=0; iiRow, pItem-iColumn;/得到当前行、列/ This structure sent to Grids parent in a WM_NOTIFY messagetypedef struct tagNM_GRIDVIEW NMHDR hdr; int iRow; int iColumn; NM_GRIDVIEW;typedef struct tagNMHDR HWND hwndFrom; / handle of control sending messageUINT idFrom;/ identifier of control sending messageUINT code; / notification code; see below NMHDR;NM_CLICKThe user has clicked the left mouse button within the control. NM_DBLCLKThe user has double-clicked the left mouse button within the control. NM_KILLFOCUSThe control has lost the input focus. NM_OUTOFMEMORYThe control could not complete an operation because there is not enough memory available. NM_RCLICKThe user has clicked the right mouse button within the control. NM_RDBLCLKThe user has double-clicked the right mouse button within the control. NM_RETURNThe control has the input focus, and the user has pressed the ENTER key. NM_SETFOCUSThe control has received the input focus. 9. 可以方便的删除和添加固定列头10.可以设置、删除、添加固定行头A:参考(4)&(5)删除可以用以下一些函数 BOOL DeleteColumn(int nColumn); BOOL DeleteRow(int nRow); BOOL DeleteNonFixedRows(); BOOL DeleteAllItems();11.可以在第一个单元格中加入Check控件A:#include NewCellTypes/GridCellCheck.h/包含头文件BOOL CGridCtrl:SetCellType(int nRow, int nCol, CRuntimeClass* pRuntimeClass);比如:CGridCtrlObject.SetCellType(1,1, RUNTIME_CLASS(CGridCellCheck);12.可设表格的背景和字体,可设单元格的颜色和字体设置表格的颜色CGridCtrlObject.GetDefaultCell(FALSE, ALSE)-SetBackClr(RGB(xxx,xxx,xxx);下面的函数均可以调用:virtual void CGridCtrl:SetTextClr(COLORREF clr);virtual void CGridCtrl:SetBackClr(COLORREF clr);virtual void CGridCtrl:SetFont(const LOGFONT* plf);设置单元格的背景颜色和前景颜色BOOL CGridCtrl:SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT)BOOL CGridCtrl:SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT)BOOL CGridCtrl:SetItemFont(int nRow, int nCol, LOGFONT*lf)颜色:COLORREF clr = RGB(xxx,xxx,xxx);字体:CFont* pFont = m_Grid.GetFont();LOGFONT lf;pFont-GetLogFont(&lf);memcpy(lf.lfFaceName, _T(Arial), 6);lf.lfEscapement = 900;lf.lfOrientation = 900;关于单元格的格式都可以通过下述方法设定,同前面关于设置单元格内容(4)的方法GV_ITEM Item设置单元格格式Item.crBkClr = ?;Item.crFgClr = ?; Item.mask |= (GVIF_BKCLR|GVIF_FGCLR);Item.lfFont=?;SetItem(&Item);13.可以方便的添加或者删除一行int CGridCtrl:InsertColumn(LPCTSTR strHeading,UINT nFormat, int nColumn = -1)int CGridCtrl:InsertRow(LPCTSTR strHeading, int nRow = -1)BOOL DeleteColumn(int nColumn)BOOL DeleteRow(int nRow)例如:CGridCtrlObject.InsertRow(_T(Newest Row), nRow);CGridCtrlObject.DeleteRow(nRow);CGridCtrlObject.Invalidate();/这句是必需的。14.可以由程序选定某一行可以调用以下函数:void SelectRow (int row)/该函数在扩展中实现了,具体可参见条款21也可以调用以下函数:void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE);void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol, BOOL bForceRepaint = FALSE);CCellID SetFocusCell(CCellID cell);CCellID SetFocusCell(int nRow, int nCol);class CCellID public: int row, col; / The zero based row and column of the cell. CCellID(int nRow = -1, int nCol = -1) int IsValid(); int operator=(const CCellID& rhs); int operator!=(const CCellID& rhs);也可以调用BOOL CGridCtrl:SetRowFocusAndSelection(int nRow,int nCol=0)这个函数选中第nRow行,同时将焦点置于第nRow行0,第nCol列。成功则返回TRUE,失败则返回FALSE.15.可以由程序自动滚动到某一行,显示在用户面前调用void CGridCtrl:AutoScrollToRow(int nRow)也可以使用void EnsureVisible(CCellID &cell) void EnsureVisible(int nRow, int nCol);16.说明添加排序功能的方法调用如下函数:void CGridCtrl:SetListMode(BOOL bEnableListMode = TRUE)void CGridCtrl:SetHeaderSort(BOOL bSortOnClick = TRUE)void CGridCtrl:SetCompareFunction(PFNLVCOMPARE pfnCompare)如果想实现排序,必须先调用CGridCtrlObject.SetListMode(TRUE);CGridCtrlObject.SetHeaderSort(TRUE);然后设置比较函数:CGridCtrlObject.SetCompareFunction(CGridCtrl:pfnCellNumericCompare);/数值排序CGridCtrlObject.SetCompareFunction(CGridCtrl: pfnCellTextCompare);/字符排序CGridCtrlObject.SetCompareFunction(NULL);/调用缺省的排序模式,即字符排序字符排序和数值排序是控件已提供的排序模式,也可以自定义排序函数,例子如下:int CALLBACK pfnCellCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)比较函数必须是全局的或是静态的。int CALLBACK MyClass:pfnCellNumericCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)CGridCellBase* pCell1 = (CGridCellBase*) lParam1;CGridCellBase* pCell2 = (CGridCellBase*) lParam2;if (!pCell1 | !pCell2) return 0;int nValue1 = _ttol(pCell1-GetText();int nValue2 = _ttol(pCell2-GetText();if (nValue1 nValue2)return -1;else if (nValue1 = nValue2)return 0;elsereturn 1;17.说明在单元格中添加或者改变图形的方法也可以这样实现头文件CImageList m_ImageList;实现文件中m_ImageList.Create(MAKEINTRESOURCE(BitMap的ID如:IDB_IMAGES), 16, 1, RGB(255,255,255);CGridCtrlObject.SetImageList(&m_ImageList);然后调用BOOL CGridCtrl:SetItemImage(int nRow, int nCol, int iImage)也可以采用(4)中设置单元格的文字内容的方法:GV_ITEM Item;Item.iImage =index;Item.mask |= (GVIF_IMAGE);CGridCtrlObject.SetItem(&Item);18.遍历所有的选中行的方法GVNI_FOCUSED / Search for focus cellGVNI_SELECTED / Search for selected cellsGVNI_DROPHILITED / Search for drop highlighted cellsGVNI_READONLY / Search for read-only cellsGVNI_FIXED / Search for fixed cells GVNI_MODIFIED / Search for modified cellsGVNI_ABOVE / Search above initial cellGVNI_BELOW / Search below initial cellGVNI_TOLEFT / Search to the left of the initial cellGVNI_TORIGHT / Search to the right of the initial cellGVNI_ALL / Search all cells in the grid starting from / the given cellGVNI_AREA / Search all cells below and to the right of / the given cellCellID GetNextItem(CCellID& cell, int nFlags) const,使用方法参见CListCtrl:GetNextItem(MSDN)下面两个函数也值得注意:BOOL IsCellSelected(CCellID &cell) constBOOL IsCellSelected(CCellID cell) const因为遍历同时要进行的具体操作不尽相同,所以我们要在使用时结合GetNextItem函数自己设计函数,这样就可以实现遍历操作了。推荐使用以下用法:int sel=m_Grid.GetNextRow(-1, GVNI_SELECTED);while(sel!=-1)/做一些事情sel=m_Grid.GetNextRow(sel, 2);/那个GVNI_SELECTED的值是2,其中GetNextRow是扩展定义的函数,见21款我们也可以设计一个函数,对所有单元便历,找到选中的单元std:list BeSelectedList;for(int i=0;iGetRowCount();i+)for(int j=0;jGetColumnCount();j+)CCellID unit(i,j);if(IsCellSelected(unit)BeSelectedList.push_back(unit);19.设置控件允许单选或者多选的方法m_Grid. SendMessageToParent (TRUE);m_Grid.SetSingleColSelection(TRUE);20.设置不要焦点和焦点外框的方法m_Grid.SetTrackFocusCell(FALSE);m_Grid.SetFrameFocusCell(FALSE);21.CGridCtrl的扩展为了方便使用,我们对CGridCtrl控件进行了扩展,涉及到以下一些方面:l 添加了void CGridCtrl:SelectRow(int row)函数,可以方面的选中一行。l 添加了int CGridCtrl:GetNextRow(int nRow, int nFlags) const函数,可以快速的找到选中行、有焦点的行等等。l 添加了LRESULT CGridCtrl:SendKeyMessage(WORD wVKey, UINT flags) const函数,用于向父窗口发送键盘消息,在父窗口中用ON_NOTIFY(WM_KEYDOWN, , ) 即可接受。l 扩展了SendMessageToParent函数,在向父窗口发送的信息中携带了鼠标位置信息。l 添加了向父窗口发送鼠标右键点击消息。l 添加了向父窗口发送点击表头的信息(原来只定义了常量,没有发送该消息)。MFC 中使用GRIDCONTROL第三方表格控件的方法(用custom control控件)2010-07-11 10:401.在GridCtrl.h文件中 注册类BOOL CGridCtrl:RegisterWindowClass() WNDCLASS wndcls; /HINSTANCE hInst = AfxGetInstanceHandle(); HINSTANCE hInst = AfxGetResourceHandle(); if (!(:GetClassInfo(hInst, _T(MyCon), &wndcls) / otherwise we need to register a new class wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; wndcls.lpfnWndProc = :DefWindowProc; wndcls.cbClsExtra = wndcls.cbWndExtra = 0; wndcls.hInstance = hInst; wndcls.hIcon = NULL;#ifndef _WIN32_WCE_NO_CURSOR wndcls.hCursor = AfxGetApp()-LoadStandardCursor(IDC_ARROW);#else wndcls.hCursor = 0;#endif wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1); wndcls.lpszMenuName = NULL; wndcls.lpszClassName = _T(MyCon); if (!AfxRegisterClass(&wndcls) AfxThrowResourceException(); return FALSE; return TRUE;2.在GridCtrl.h 文件中CGridCtrl:CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols) RegisterWindowClass(); /调用上述类MyCon /后续处理3.定义相关变量int m_nFixCols;int m_nFixRows;int m_nCols;int m_nRows;CSize m_OldSize;CGridCtrl m_Grid; /表格类变量DDX_Control(pDX, IDC_GRID, m_Grid);/custom control控件变量 将该控件的Class属性设置为MyCon4.使用:void CZServerView:OnInitialUpdate()CFormView:OnInitialUpdate();GetParentFrame()-RecalcLayout();ResizeParentToFit();UINT_PTR iInstallresult; iInstallresult=SetTimer(1,1000,NULL); CRect rect;GetClientRect(rect);m_OldSize = CSize(rect.Width(), rect.Height();m_Grid.EnableDragAndDrop(TRUE);m_Grid.GetDefaultCell(FALSE, FALSE)-SetBackClr(RGB(0xFF, 0xFF, 0xE0);m_nFixCols = 1;m_nFixRows = 1;m_nCols = 13; m_nRows = 0; m_Grid.SetAutoSizeStyle();TRY m_Grid.SetRowCount(m_nRows); m_Grid.SetColumnCount(m_nCols); m_Grid.SetFixedRowCount(m_nFixRows); m_Grid.SetFixedColumnCount(m_nFixCols); CATCH (CMemoryException, e) e-ReportError(); /return TRUE; END_CATCH char colname1250=设备编号,卡口地点,行驶方向,号牌号码,号牌种类,经过时间,车辆速度,车长,号牌颜色,车辆类型,报警类型,车道; for (int col = 1; col m_Grid.GetColumnCount(); col+) CString str; GV_ITEM Item; Item.mask = GVIF_TEXT; Item.row = 0; Item.col = col; str=colnamecol-1; Item.strText = str; m_Grid.SetItem(&Item); m_Grid.SetFixedColumnCount(1); m_Grid.SetEditable(false); m_Grid.EnableDragAndDrop(FALSE); m_Grid.AutoSizeRows(); m_Grid.AutoSizeColumns(GVS_BOTH); /让列宽度自动适合控件 (同时适应数据和值) m_Grid.ExpandLastColumn(); /让最后一列宽度自适应控件的剩余部分GridCtrl函数详解CGridCtrl控件 控件的特点:使用鼠标可以进行单元格的选择,还可以辅助ctrl和shift的组合键进行选择。也可以取消选择。 行和列可以按照大小进行重排,还可以取消对行、列或两者的排序。 双击区分点,行或者列可以按照大小自动排序 可以对任何列或行固定 单元格可以有不同文本和背景颜色的个性化设置 单元格可以有字体的个性化设置 单元格可以标注只读或者其他的状态设置及检测 OLE的拖放动作 Ctrl-C, Ctrl-X和Ctrl-V执行拷贝、剪切、粘贴操作,Ctrl-A全选 当单元格成为焦点,并且在单元格的编辑区域按下字符键,就意味着在那个单元格进行编辑了 支持微软的智能鼠标 可以在单元格中加入图片 对大型数据可以使用虚拟模式 充分的打印支持,支持文档/浏览环境(包括打印预览)或是基于会话的应用(不支持打印预览) 可选的列表模式,包括对行的全选或单选,还有单击列标题提示进行插入的操作。 众多的虚函数可以很容易对控件进行功能扩充 支持UNICODE 支持WinCE 单元格的标题提示太小不能显示数据 可以隐藏行和列 在VC4.2、5.0、6.0和CE工具箱2.0、3.0下编译通过示例中示范了grid控件中大部分特征文档如果想在你的工程中使用这个Grid控件的话,你还得在你的工程中添加一些文件:gridctrl.cpp, gridctrl.h Grid控件资源文件和头文件gridcellbase.cpp, gridcellbase.h 单元格的基础类gridcell.cpp, gridcell.h 单元格的默认执行文件CellRange.h CcellID和CcellRange类的定义MemDC.h Keith Rules的直接存储类InPlaceEdit.cpp, InPlaceEdit.h 定位编辑窗口的源文件和头文件GridDropTarget.cpp, GridDropTarget.h Grid容器的drag和drop对象 只有在gridctrl.h中没有定义 GRIDCONTROL_NO_DRAGDROP的时候才有必要使用。 Titletip.cpp, Titletip.h 从Zafir Anjum那里的到的单元格标题提示. 只有在gridctrl.h中没有定义 GRIDCONTROL_NO_TITLETIPS 的时候才有必要使用结构这个Grid是基于一种框架(CgridCtrl工程),这种框架组织和控制那些容纳数据、执行某些操作如画图、句柄方法如按钮的点击事件的单元格的动作。 Grid工程本身的句柄事件如点击是在单元格之前响应,如果它认为有必要的话,它还会发送某种鼠标信息。它还包含一个拖曳对象(CGridDropTarget)和一个标题提示对象(CTitleTip),前者处理拖曳操作,后者在单元格物理空间在最大限度内不足以显示其内容时可以显示出其内容。Grid单元格可以是任何类型,其长度与源自CgridBaseCell的类的长度一样。包含这个包的是一个CgridCell类,它能处理基本的数据存储和编辑操作。扩充的两个类CgridCellCombo和CGridURLCell示范了如何创建自己的单元格类。单元格有两种主要状态即固定和非固定。固定的单元格通常在Grid的左上方,并且不会随着Grid的卷动而移动。通常这些单元格包含列和行的标题部分,并且不能进行编辑。而非固定的单元格构成了Grid的内部,你可以对它进行编辑和选择。Grid的各种不同属性的默认值存放在CgridDefaultCell中。每个Grid中通常有四种属性-每个Grid中含有非固定、列固定、行固定以及行列同时固定的单元格的默认值。因此,为了实现设置Grid的默认属性,首先得使用CGridCtrL:GetDefaultCell来取得单元格的默认实现,然后你就可以直接设置了单元格的属性除字体属性外都很明确。每一个单元格都有一个指向字体结构体的指针,这个指针只有当你的自行设置单元格的字体属性时才会被分配和使用。Grid还有一种虚拟模式阻止Grid创建实际的格子,每当它需要单元格的信息时,允许你的指定一种回收函数或者消息机制来获得。这样当工作轻微减少时可以节省大量的内存费用。发送给Grid父类的消息GVN_ODCACHEHINT可以帮助你的在Grid的单元格发送信息请求时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 给水工程绿色施工方案
- 城乡供水管网智能化升级改造方案
- 住宅小区地下车库私人车位租赁合同
- 离婚诉讼中第二次财产评估及分配合同
- 商业综合体商铺租赁合同范本:多元化业态租赁协议
- 离婚协议范本:共同财产分配及子女抚养责任明确协议
- 浙江机房保温施工方案
- 校园暴力算安全教育吗
- 离婚协议书中关于共同债务承担的补充协议范本
- 祁菊与张伟离婚协议:共同财产分割及子女抚养权协议
- 防诈骗班会课件
- 旅行社安全应急救援预案
- 无痛人流患者护理查房
- DDI:制造业人才发展成功实践手册
- 老年照护芳香疗法应用规范
- 2025年抗菌药物授权培训
- 风力发电征地协调方案(3篇)
- 2025至2030年中国汽车制动器行业市场分析研究及发展战略研判报告
- 2025至2030中国淀粉粘合剂行业现状调查与前景竞争对手分析报告
- 黑龙江:装配式混凝土矩形渠道应用技术规范(DB23-T 2334-2019)
- JG/T 127-2017建筑门窗五金件滑撑
评论
0/150
提交评论