`
jerry_shen
  • 浏览: 100530 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个非常好用的Grid类及其相关类

    博客分类:
  • Java
阅读更多
这里是我写的一个Grid类,可以用作数据表示,传输。Excel解析等等方面。这里的源码是四年前的代码原型。等项目过一阶段我会放出现在和spring BindException集成的版本。
/**
 * <p>
 * Grid description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 1st, 2004 
 * ---------------------------------------------------------------------------
 * @History
 */
package com.infosys.redpas.model;

import java.util.ArrayList;
import java.util.TreeMap;

public class Grid {
	
	private Row[] rows;

	private Modeler rowModeler;

	private int width = 0;	
	
	private TreeMap metaData;
	
	private Row metaRow;
	
	public Grid(){
		super();
		rowModeler = new DefaultModeler();
		metaData = new TreeMap();
		metaRow = null;
	}
	
	public Grid(Modeler m){
		this();
		setRowModeler(m);
	}
	
	/**
	 * @return Returns the rowModeler.
	 */
	public Modeler getRowModeler() {
		return rowModeler;
	}
	/**
	 * @param rowModeler The rowModeler to set.
	 */
	public void setRowModeler(Modeler rowModeler) {
		this.rowModeler = rowModeler;
	}
	/**
	 * @return Returns the width.
	 */
	public int getWidth() {
		return width;
	}
	/**
	 * @param width The width to set.
	 */
	public void setWidth(int width) {
		this.width = width;
	}
	
	// Get the rows count of the grid
	public int getHeight(){
		if (rows==null)
			return 0;
		return rows.length;
	}
	
	// set up the grid table head row
	public void setMetaRow(Row r){
		if (getHeight()==0&& r != null && r.getFieldsNumber() > 0 ){
			metaRow = r;
			setWidth(r.getFieldsNumber());
		}
		else if (getWidth()> 0 && r.getFieldsNumber()==getWidth()){
			metaRow = r;
		}
	}
	
	// get the grid table head row
	public Row getMetaRow(){
		if (metaRow != null)
			return metaRow.getRow();
		else 
			return  Row.EMPTY_ROW;
	}
	
	// get the grid table head by col
	public String getRowHead(int col){
		Row r = getMetaRow();
		if (r!=null && !(r.getField(col)==null ||"".equals(r.getField(col))))
				return r.getField(col);
		else
			return "";
	}
	
	// add a row to the grid, the row will be validated
	public void addRow(Row r){
		if (rowModeler == null||Row.EMPTY_ROW.equals(r))
			return;
		if (!validate(r))
			return;
		if (rows == null) {
			if (getWidth()==0){
				rows = new Row[1];
				rows[0] = r;
				width = r.getFieldsNumber();
				metaRow = new Row(getWidth());
			}
			else if (getWidth() == r.getFieldsNumber()) {
				rows = new Row[1];
				rows[0] = r;
			}else {
				return;
			}
		}
		else if (getWidth() == r.getFieldsNumber()){
			Row[] rs = new Row[getHeight()+1];
			for (int i=0;i<getHeight();i++)
				rs[i] = rows[i];
			rs[getHeight()] = r;
			rows = rs;
		}
		else {
			return;
		}
	}
	
	// remove one row of the grid
	public void removeRow(int pos){
		if (pos < 0 || getHeight() <= pos || rows == null){
			return;
		}
		else if (getHeight() == 1 && pos == 0){
			rows = null;
			return;
		}
		else {
			Row[] rs = new Row[getHeight()-1];
			for (int i=0,j=0; i <getHeight()-1; i++,j++){
				if (j!=pos) {
					rs[i] = rows[j];
				} else {
					i--;
				}
			}
			rows = rs;
		}
	}
	
	// model one row to a Model object
	public Model doModel(int row){
		if (rowModeler == null)
			return null;
		if (row < getHeight() && row >= 0 && (! (rowModeler == null))){
			return rowModeler.doModel(rows[row]);			
		}
		else return null;
	}
	
	// set one field of the grid
	public void setField(int row, int col, String value){
		if (row >=0 && row < getHeight() && col >= 0 && col < getWidth())
			rows[row].setField(col,value);
	}
	
	// get one field of the grid
	public String getField(int row, int col){
		if (row >=0 && row < getHeight() && col >= 0 && col < getWidth() && rows != null)
			return rows[row].getField(col);
		else 
			return null;
	}
	
	// get the row of the grid
	public Row getRow(int row){
		if (row >= 0 && row < getHeight() )
			return rows[row].getRow();
		else 
			return null;
	}
	
	// set one row of the grid, the row will be validated
	public void setRow(int row,Row r){
		if (r.getFieldsNumber()== getWidth() && row >= 0 && row < getHeight() && validate(r))
			rows[row] = r;		
	}
	
	// get the row(use as an colum) of one colum
	public Row getColum(int col){
		if (col >= 0 && col < getWidth()) {
			Row r = new Row(getHeight());
			for (int i=0; i< r.getFieldsNumber();i++)
				r.setField(i,getField(i,col));
			return r;
		}
		else 
			return null;
			
	}	
	
	// set one colum of this grid
	public void setColum(int col,Row colum){
		if (getHeight()==colum.getFieldsNumber()&&col >=0 && col < getWidth()){
			for (int i=0; i < getHeight();i++)
				setField(i,col,colum.getField(i));
		}
	}
	
	// set the meta data carried by the grid
	// if the key is not existed, then create a new key
	public void setMetaData(String key,String value){
		try {
			metaData.put(key, value);
		}catch (Exception e){
		}		
	}
	
	// get the meta data carried with the grid
	// return "" if the meta data is not existed 
	public String getMetaData(String key){
		try {
			String str = (String)metaData.get(key);
			if (str == null || "".equals(str))
				return "";
			else 
				return str;
		}
		catch (Exception e){
			return "";
		}
	}
	
	// generate the model list.
	public ArrayList generateList(){
		ArrayList arr = new ArrayList();
		for (int i=0; i < getHeight();i++) {
			Model m = doModel(i);
			if (m==null)
				return null;
			else 
				arr.add(m);
		}		
		return  arr;		
	}
	
	// print out the grid on the console
	public void consoleShow(){
		for (int i=0; i < getHeight();i++){
			Row r = getRow(i);
			r.consoleShow();
		}
	}
	
	// see wether one row in the grid is validated
	public boolean validate(Row r){
		if (rowModeler == null)
			return false;
		else 
			return rowModeler.validate(r);
	}
	
	// see all the rows in the grid is validated
	public boolean validate(){
		if (rowModeler == null)
			return false;
		else if (getHeight()==0)
			return false;
		else {			
			for (int i=0; i<getHeight();i++){
				if (!validate(rows[i]))
					return false;
			}
			return true;
		}		
	}
	
	// add an model to the grid using the rowmodeler's deModel
	public void addRowByModel(Model m){
		try {
			Row r = rowModeler.deModel(m);
			addRow(r);				
		}catch (Exception e){
		}
	}
	
}


/**
 * <p>
 * Model description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 1st, 2004
 * ---------------------------------------------------------------------------
 * @History
 */
package com.infosys.redpas.model;

import java.io.Serializable;

// This is the parent class for all the models
public class Model implements Serializable{
}

/**
 * <p>
 * Modeler description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 1st, 2004 
 * ---------------------------------------------------------------------------
 * @History
 */

package com.infosys.redpas.model;

public interface Modeler{
	// Model a model from a row
	public Model doModel(Row r);	
	
	// validate to see if the row can model a model
	public boolean validate(Row r);
	
	// deModel a model to a row
	public Row deModel(Model m);
}


/**
 * <p>
 * DefaultModeler description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 2nd, 2004
 * ---------------------------------------------------------------------------
 * @History
 */

package com.infosys.redpas.model;

// The dumb defaultModeler for normal grids
// a Grid must had a Modeler
public class DefaultModeler implements Modeler{

	public Model doModel(Row r){
		return r;
	}
	
	public boolean validate(Row r){
		return true;
	}
	
	public Row deModel(Model m){
		return Row.EMPTY_ROW;
	}
}



/**
 * <p>
 * Row description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 1st, 2004 
 * ---------------------------------------------------------------------------
 * @History modified by Jerry Shen, Dec. 9th, 2004
 */
package com.infosys.redpas.model;

public class Row extends Model{
	private String[] fields;

	public static final Row EMPTY_ROW = new Row();
	
	public Row(int length){
		fields = new String[length];
	}
		
	public Row(){
		this(1);
		setField(0,"");
	}
	
	public Row(String[] row){
		this(row.length);
		setFields(row);
	}
	
	public int getFieldsNumber(){
		Row r= getRow();
		if (r.getField(0)==null ||"".equals(r.getField(0)))
			return 0;
		else 
			return fields.length;
	}
	
	public void setFields(String[] fields){
		this.fields = fields;
	}
	
	public String[] getFields(){
		return fields;
	}
	
	public String getField(int pos){
		if (this==Row.EMPTY_ROW ||fields == null || fields.length < pos + 1 || pos < 0)
			return "";
		else 
			return fields[pos];
	}
	
	public void setField(int pos,String value){
		if (this == Row.EMPTY_ROW ||fields == null || fields.length < pos + 1)
			return;
		else 
			fields[pos] = value;
	}
	
	public String toString(){
		StringBuffer sb = new StringBuffer();
		if (getFieldsNumber()>0){
			for (int i=0; i < getFieldsNumber();i++)
				sb.append(getField(i)).append(", ");
			sb.deleteCharAt(sb.length()-1).deleteCharAt(sb.length()-1);
			return sb.toString();
		}
		else 
			return "";
	}
	
	public void consoleShow(){
		System.out.println(toString());	
	}
	
	public Row getRow(){
		if (fields==null)
			return EMPTY_ROW;
		else {
			for (int i= 0;i<fields.length;i++){
				if (fields[i]!= null)
					return this;
			}
			return EMPTY_ROW;				
		}
	}
	
	public boolean equals(Row r){
		Row thisRow = this.getRow();
		Row thatRow = r.getRow();
		if (thisRow.getFieldsNumber()!=thatRow.getFieldsNumber())
			return false;
		else {
			for (int i = 0; i < thisRow.getFieldsNumber();i++){
				if (!thisRow.getField(i).equals(thatRow.getField(i)))
						return false;
			}
			return true;
		}
	}
}



/**
 * <p>
 * ActualExpenseModeler description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 2nd, 2004
 * ---------------------------------------------------------------------------
 * @History
 */
package com.infosys.budget.modeler;

import com.infosys.budget.model.ActualExpense;
import com.infosys.redpas.model.Model;
import com.infosys.redpas.model.Modeler;
import com.infosys.redpas.model.Row;

public class ActualExpenseModeler implements Modeler{
	private Row row;
	
	public Model doModel(Row r){
		if (!validate(r)) {
			return null;
		}
		else {
			try {
				ActualExpense exp = new ActualExpense();
				String[] rValue = r.getFields();
				exp.setActualExpenseId(rValue[0]);
				exp.setExpenseHeadId(rValue[1]);
				exp.setBudgetId(rValue[2]);
				exp.setMonth(rValue[3]);
				exp.setAmount(Double.parseDouble(rValue[4]));
				exp.setCurrencyId(rValue[5]);
				exp.setExchangeRate(Double.parseDouble(rValue[6]));
				exp.setInputTime(rValue[7]);
				exp.setActualExpenseBatchId(rValue[8]);
				return exp;
			} catch (Exception e){
				return null;
			}
		}	
	}
	
	public boolean validate(Row r){
		if (r==null || r.getFieldsNumber()!= 9)
			return false;
		for (int i=0; i < r.getFieldsNumber();i++){
			if (r.getField(i)==null || "".equals(r.getField(i))){
				return false;
			}
		}
		try {
			Long.parseLong(r.getField(0));
			Long.parseLong(r.getField(1));
			Long.parseLong(r.getField(2));
			Float.parseFloat(r.getField(4));
			Float.parseFloat(r.getField(6));
			Long.parseLong(r.getField(8));
		} catch (Exception e){
			return false;
		}
		return true;
	}
	
	public Row deModel(Model actualModel){
		if (actualModel == null) {
			return Row.EMPTY_ROW;
		}
		else {
			try {
				ActualExpense actual=(ActualExpense)actualModel;
				Row r = new Row(9);
				r.setField(0,actual.getActualExpenseId());
				r.setField(1,actual.getExpenseHeadId());
				r.setField(2,actual.getBudgetId());
				r.setField(3,actual.getMonth());
				r.setField(4,""+actual.getAmount());
				r.setField(5,actual.getCurrencyId());
				r.setField(6,""+actual.getExchangeRate());
				r.setField(7,actual.getInputTime());
				r.setField(8,actual.getActualExpenseBatchId());
				return r;
			} catch (Exception e){
				return Row.EMPTY_ROW;
			}
		}	
	}
}


分享到:
评论
5 楼 jerry_shen 2008-08-24  
没有界面,是用于数据表示的Utils类。
4 楼 nismaster 2008-08-24  
看一下显示的界面拉
3 楼 jerry_shen 2008-08-24  
另两个相关类
/**
 * <p>
 * ActualExpense description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Nov. 29th, 2004
 * ---------------------------------------------------------------------------
 * @History
 */
package com.infosys.budget.model;

import com.infosys.redpas.model.Model;

public class ActualExpense extends Model {

	private String actualExpenseId;

	private String expenseHeadId;

	private String budgetId;

	private String month;

	private double amount;

	private String currencyId;

	private double exchangeRate;

	private String inputTime;

	private String actualExpenseBatchId;	

	//	 constructors
	public ActualExpense(){
		super();
	}	
	

	/**
	 * @return Returns the actualExpenseId.
	 */
	public String getActualExpenseId() {
		return actualExpenseId;
	}
	/**
	 * @param actualExpenseId The actualExpenseId to set.
	 */
	public void setActualExpenseId(String actualExpenseId) {
		this.actualExpenseId = actualExpenseId;
	}
	/**
	 * @return Returns the amount.
	 */
	public double getAmount() {
		return amount;
	}
	/**
	 * @param amount The amount to set.
	 */
	public void setAmount(double amount) {
		this.amount = amount;
	}
	/**
	 * @return Returns the budgetId.
	 */
	public String getBudgetId() {
		return budgetId;
	}
	/**
	 * @param budgetId The budgetId to set.
	 */
	public void setBudgetId(String budgetId) {
		this.budgetId = budgetId;
	}
	/**
	 * @return Returns the currencyExchangeRate.
	 */
	public double getExchangeRate() {
		return exchangeRate;
	}
	/**
	 * @param exchangeRate The currencyExchangeRate to set.
	 */
	public void setExchangeRate(double exchangeRate) {
		this.exchangeRate = exchangeRate;
	}
	/**
	 * @return Returns the currencyId.
	 */
	public String getCurrencyId() {
		return currencyId;
	}
	/**
	 * @param currencyId The currencyId to set.
	 */
	public void setCurrencyId(String currencyId) {
		this.currencyId = currencyId;
	}
	/**
	 * @return Returns the expenseHeadId.
	 */
	public String getExpenseHeadId() {
		return expenseHeadId;
	}
	/**
	 * @param expenseHeadId The expenseHeadId to set.
	 */
	public void setExpenseHeadId(String expenseHeadId) {
		this.expenseHeadId = expenseHeadId;
	}
	/**
	 * @return Returns the inputTime.
	 */
	public String getInputTime() {
		return inputTime;
	}
	/**
	 * @param inputTime The inputTime to set.
	 */
	public void setInputTime(String inputTime) {
		this.inputTime = inputTime;
	}
	/**
	 * @return Returns the month.
	 */
	public String getMonth() {
		return month;
	}
	/**
	 * @param month The month to set.
	 */
	public void setMonth(String month) {
		this.month = month;
	}
	/**
	 * @return Returns the actualExpenseBatchId.
	 */
	public String getActualExpenseBatchId() {
		return actualExpenseBatchId;
	}
	/**
	 * @param actualExpenseBatchId The actualExpenseBatchId to set.
	 */
	public void setActualExpenseBatchId(String actualExpenseBatchId) {
		this.actualExpenseBatchId = actualExpenseBatchId;
	}
	public boolean equals(Object o) {
		if (o == null) {
			return false;
		} else if (this == o) {
			return true;
		} else if (o instanceof ActualExpense) {
			ActualExpense that = (ActualExpense) o;
			return that.getActualExpenseId().equals(this.getActualExpenseId());
		} else {
			return false;
		}
	}
	
	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("actualExpenseId:").append(getActualExpenseId()).append("\n")
		.append("amount:").append(getAmount()).append("\n")
		.append("budgetId:").append(getBudgetId()).append("\n")
		.append("exchangeRate:").append(getExchangeRate()).append("\n")
		.append("currencyId:").append(getCurrencyId()).append("\n")
		.append("expenseHeadId:").append(getExpenseHeadId()).append("\n")
		.append("inputTime:").append(getInputTime()).append("\n")
		.append("month:").append(getMonth()).append("\n")
		.append("actualExpenseBatchId").append(getActualExpenseBatchId()).append("\n");
		return sb.toString();
	}
}


/**
 * <p>
 * ActualExpenseBatch description
 * </p>
 * 
 * @author Jerry Shen
 * @version v 1.0 Dec. 3rd, 2004
 * ---------------------------------------------------------------------------
 * @History
 */
package com.infosys.budget.model;

import com.infosys.redpas.model.Model;

public class ActualExpenseBatch extends Model {

	private String actualExpenseBatchId;

	private String budgetId;
	
	private String budgetName;

	private String month;

	private String comments;	

	//	 constructors
	public ActualExpenseBatch(){
		super();
	}	
	

	/**
	 * @return Returns the actualExpenseBatchId.
	 */
	public String getActualExpenseBatchId() {
		return actualExpenseBatchId;
	}
	/**
	 * @param actualExpenseBatchId The actualExpenseBatchId to set.
	 */
	public void setActualExpenseBatchId(String actualExpenseBatchId) {
		this.actualExpenseBatchId = actualExpenseBatchId;
	}
	/**
	 * @return Returns the budgetId.
	 */
	public String getBudgetId() {
		return budgetId;
	}
	/**
	 * @param budgetId The budgetId to set.
	 */
	public void setBudgetId(String budgetId) {
		this.budgetId = budgetId;
	}
	/**
	 * @return Returns the budgetName.
	 */
	public String getBudgetName() {
		return budgetName;
	}
	/**
	 * @param budgetName The budgetName to set.
	 */
	public void setBudgetName(String budgetName) {
		this.budgetName = budgetName;
	}
	/**
	 * @return Returns the comment.
	 */
	public String getComments() {
		return comments;
	}
	/**
	 * @param comment The comment to set.
	 */
	public void setComments(String comment) {
		this.comments = comment;
	}
	/**
	 * @return Returns the month.
	 */
	public String getMonth() {
		return month;
	}
	public String getMonthName() {
		if ("00".equals(month))
			return "Jan";
		else if ("01".equals(month))
			return "Feb";
		else if ("02".equals(month))
			return "Mar";
		else if("03".equals(month))
			return "Apr";
		else if ("04".equals(month))
			return "May";
		else if ("05".equals(month))
			return "Jun";
		else if ("06".equals(month))
			return "Jul";
		else if ("07".equals(month))
			return "Aug";
		else if("08".equals(month))
			return "Sep";
		else if ("09".equals(month))
			return "Oct";
		else if ("10".equals(month))
			return "Nov";
		else if ("11".equals(month))
			return "Dec";
		else 
			return "Jan";
	}
	/**
	 * @param month The month to set.
	 */
	public void setMonth(String month) {
		this.month = month;
	}
	public boolean equals(Object o) {
		if (o == null) {
			return false;
		} else if (this == o) {
			return true;
		} else if (o instanceof ActualExpense) {
			ActualExpense that = (ActualExpense) o;
			return that.getActualExpenseId().equals(this.getActualExpenseBatchId());
		} else {
			return false;
		}
	}
	
	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("actualExpenseBatchId:").append(getActualExpenseBatchId()).append("\n")
		.append("budgetId:").append(getBudgetId()).append("\n")
		.append("comment:").append(getComments()).append("\n")
		.append("month:").append(getMonth()).append("\n");
		return sb.toString();
	}
}
2 楼 jerry_shen 2008-08-23  
Grid类的metaData是元数据,metaRow是题头行,Modeler是造型器,Row是数据行。
1 楼 jerry_shen 2008-08-23  
本质上,这个类是两维电子表格,两维的字符串数据集和他们的一些方便方法的集成。

相关推荐

    很好用的PropertyGrid控件

    在你提供的文件列表中,我们可以看到一系列与PropertyGrid相关的源代码文件,这表明这是一个自定义实现的PropertyGrid控件,可能包含了增强的功能和交互设计。 1. **PropertyGrid.cpp**:这是PropertyGrid控件的...

    WinForm属性编辑 propertyGrid示例 仿window

    在Windows Forms(WinForm)开发中,`propertyGrid`控件是一个非常实用的工具,它允许用户以类似于Visual Studio(VS)设计器的方式查看和编辑对象的属性。`propertyGrid`提供了一个直观、易于使用的界面,使得应用...

    propertygrid显示事件

    在.NET Framework中,`PropertyGrid`控件是一个非常强大的工具,用于在用户界面中显示对象的属性,并允许用户进行交互式编辑。这个控件广泛应用于各种应用程序的设置或配置界面,因为它可以自动根据对象的属性生成一...

    PropertyGrid

    PropertyGrid控件是.NET框架中一个非常有用的组件,它主要用于展示和编辑对象或类型的属性,类似于Visual Studio .NET中的属性浏览器。控件通过反射技术获取和修改对象的属性,反射是一种在运行时检查和操作类型及其...

    sencha touch grid

    Sencha Touch是一个流行的JavaScript库,用于构建高性能、跨平台的触摸友好型移动应用程序。Grid组件在移动应用中常用于展示和操作结构化数据,类似于桌面应用中的表格。 ### Sencha Touch Grid简介 Sencha Touch ...

    matlab开发-pcloud2grid

    以下是关于这个函数及其相关知识点的详细说明: 1. **点云数据**:点云是由三维空间中一系列离散点组成的数据集,每个点通常包含XYZ坐标信息,有时还包含颜色、法线等附加信息。它们由激光雷达(LiDAR)、深度相机...

    960grid 用于前端布局

    960 Grid System 是一种广泛应用于前端开发的布局框架,由 Nathan Smith 创建,旨在提供一个高效、可重复使用的网格系统,以帮助设计师和开发者快速构建网页界面。这个系统的名称来源于其核心理念:整个页面被分为...

    Ext2.0框架的Grid使用介绍

    Grid的核心在于`Ext.grid.GridPanel`类及其相关的配置项。 ##### 1. ColumnModel的定义 - **ColumnModel**:用于定义Grid的列布局,指定每一列的标题、数据索引和其他属性。 - 示例代码: ```javascript var cm...

    matlab开发-gridcolor

    通过以上描述,我们可以理解`gridcolor`在MATLAB绘图中的作用及其使用方法,这有助于我们定制更符合视觉需求的科学图表。对于数据分析和结果展示来说,这样的自定义功能非常实用,能够帮助我们更好地传达信息。在...

    FLEX DATA GRID 分页

    下面将详细解释FLEX Data Grid的分页实现及其相关知识点。 1. **什么是Flex Data Grid**: Flex Data Grid是Adobe Flex框架中的一个组件,全称为MX:DataGrid或Spark:DataGrid。它用于展示和操作表格形式的数据,...

    An Easy Reference for ALV Grid Control

    本文档旨在为使用 SAP 的 ALV Grid 控制提供一个简洁且实用的参考资料。ALV(Application List Viewer)是一种用于在 SAP GUI 中显示列表数据的强大工具。它允许用户通过高度定制化的界面来呈现复杂的数据结构。本...

    几个非常好的js树

    以下是对这些文件及其相关知识点的详细介绍: 1. **dhtmlxGrid** dhtmlxGrid是一款强大的JavaScript数据网格组件,它提供了丰富的功能,如数据排序、分页、过滤、编辑等。这个组件可以处理大量数据,并支持多种...

    PropertyGrid控件实现多国语言

    在C# WPF开发中,`PropertyGrid`控件是一个非常实用的工具,它能够以网格形式展示对象的属性,并允许用户进行交互式编辑。在国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)的场景下,...

    自已用画笔写的表格类

    `Grid.cpp`和`Grid.h`可能类似,定义了一个或多个与表格相关的类,比如存储和操作表格数据的类,以及用于绘制表格单元格的方法。 在实际使用这个自定义表格类时,开发者需要理解`Grid`类如何存储和管理数据,以及`...

    Ext表格列锁定+多表头插件

    在本文中,我们将深入探讨"Ext表格列锁定+多表头插件"这一主题,它在Ext3.4版本中的实现及其相关技术。这个插件主要用于改进Ext Grid的用户体验,特别是处理大量数据时,通过列锁定和多表头功能,使得用户能够更有效...

    商品分类展示

    以下是对这个项目及其相关知识点的详细解读。 首先,商品分类展示的核心在于数据结构的设计与管理。在JavaScript中,这通常涉及到对象或数组的组织。商品类别可能以树形结构存储,每个节点代表一个类别,包含子类别...

    Grid and Cloud Database Management

    《Grid and Cloud Database Management》是一本对于从事信息技术、特别是专注于数据库管理和云计算领域的专业人士非常有价值的参考书。通过阅读本书,读者不仅可以获得关于网格和云计算环境下数据库管理的基础知识,...

    LINUX下ORACLE11GR2安装GRID依赖包

    在这个过程中,`libaio`(Library for Asynchronous I/O)是一个必要的组件,它为应用程序提供了直接内存访问,以提高I/O性能。本文将详细介绍`libaio`及其在Oracle 11g R2安装过程中的作用。 首先,`libaio-0.3....

    源代码(ALV 报表 F4 增删插改按钮功能).pdf

    2. F4按钮和事件处理:在ALV Grid中,F4按钮是一个标准功能,用于提供一个快捷方式来选择或查找值。当用户在ALV Grid中的某个字段按下F4键时,SAP系统会触发一个事件处理程序来响应这个操作。处理程序会打开一个弹出...

    塔吉克斯坦高程分类数据集.rar

    3. TajikistanEVC:这个文件名暗示了它是关于塔吉克斯坦的高程分类数据,可能是一个栅格数据文件,如TIFF或GRID格式,提供了整个国家的高程信息,将地理空间位置与特定的海拔值对应起来。这样的数据可用于生成地形图...

Global site tag (gtag.js) - Google Analytics