大侦探福尔摩斯2:诡影游戏

再次期待小羅伯特.唐尼給我們帶來不一樣的福爾摩斯!
下載地址(磁力下載):
magnet:?xt=urn:btih:A50268F8D5ABD5C5FF3A9E78AF9C398879CD0BDC&tr.0=http://tracker.openbittorrent.com/announce&tr.1=udp://tracker.openbittorrent.com:80/announce&tr.2=http://tracker.thepiratebay.org/announce&tr.3=http://tracker.publicbt.com/announce&tr.4=http://tracker.prq.to/announce&tr.5=http://torrent-download.to:5869/announce
分享按钮
ORACLE JOB應用
JOB相關知識
創建一個JOB
declare
BJOB NUMBER:=996;
T_R BOOLEAN:=TRUE;
begin
dbms_job.submit(BJOB,’P_EFACTORY_1;’,Sysdate,’sysdate+1/48′,T_R);
– dbms_job.run(bjob);
– commit;
end;
分析:
1) P_EFACTORY_1;這個位置把要執行的PROCEDURE寫進來後面加一個分號
2)間隔時間: 即每兩次執行的時間差:如上表示時間差為30分鐘
即24小時*(1/48)
若為
dbms_job.submit(BJOB,’P_EFACTORY_1;’,Sysdate,’sysdate+1/720′,T_R);
則表示間隔時間為2分鐘,即24小時*(1/720)
此參數只在第一次運行的時候起作用,以後的執行時間都是根據第三個參數算出來的。
3) 若創建本次JOB,本次也要執行則
declare
BJOB NUMBER:=996;
T_R BOOLEAN:=TRUE;
begin
dbms_job.submit(BJOB,’P_EFACTORY_1;’,Sysdate,’sysdate+1/48′,T_R);
dbms_job.run(bjob);
commit;
end;
上面紅色部分則表示創建本次JOB的同時也執行本次JOB
重啟JOB
用如下語句可以從新啟動JOB
首先,用如下語句把數據庫中相關的JOB信息找出來,
SELECT*FROM ALL_JOBS,得出如下畫面:
找到需要從新啟動的JOB號,JOB那個欄位,把JOB號碼輸入到如下語句中,就可以從新啟動JOB
Declare
BEGIN
DBMS_JOB.RUN(63);
END;
刪除JOB
用如上同樣的方法把JOB號找出來,再用如下語句,即可把JOB刪除掉
Declare
BEGIN
DBMS_JOB.REMOVE(82);
END;
JOB有錯處理方法
JOB有錯標誌:
1)用SELECT*FROM ALL_JOBS,得出如下畫面,若欄位FAILURES的數目大於0則表示該JOB有錯
(圖A)
2)用SELECT*FROM ALL_JOBS ,得出如下畫面,若NEXT_DATE有類似LIKE ‘400%’則表示有錯
(圖B)
處理方法,找到改錯誤JOB所執行的程式,即上面圖A中欄位為WHAT裏面的PROCEDURE,運行PROCEDURE,看有什麼錯誤,若運行OK,則重啟JOB即可
SQL查詢優化
SQL 查詢優化
1. 索引的使用:
什麼是索引?
使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。
(1).当插入的数据为数据表中的记录数量的10%以上,首先需要删除该表的索引来提高数据的插入效率,当数据插入后,再建立索引。
(2).避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器將不再使用索引而使用全表扫描。如:
低效:select * from dept where sal*12 >2500;
高效:select * from dept where sal>2500/12;
(3).避免在索引列上使用not和 “!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到not 和 “!=”时,就会停止使用索引而去执行全表扫描。
(4).索引列上>=代替>
低效:select * from emp where deptno > 3
高效:select * from emp where deptno >=4
两者的区别在于,前者dbms将直接跳到第一个deptno等于4的记录,而后者将首先定位到deptno等于3的记录并且向前扫描到第一个deptno大于3的。
(5).非要对一个使用函数的列启用索引,基于函数的索引是一个较好的方案。
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/
SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将使用索引*/
2. 游标的使用:
游标的概念
游标提供了一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,處理由客户端发送给服务器端的SQL语句,或是批處理、存储过程、触发器中的数据處理请求。游标的优点在于它可以定位到结果集中的某一行,并可以对该行数据执行特定操作,为用户在处理数据的过程中提供了很大方便。一个完整的游标由5部分组成,并且这5个部分应符合下面的顺序。
当在海量的数据表中进行数据的删除、更新、插入操作时,用游标处理的效率是最慢的,但是游标又是必不可少的,所以正确使用游标十分重要:
(1). 在数据抽取的源表中使用时间戳,这样每天的维表数据维护只针对更新日期为最新时间的数据来进行,大大减少需要维护的数据记录数。
时间戳概念:数据库中自动生成的唯一二进制数字,与时间和日期无关的, 通常用作给表行加版本戳的机制。存储大小为 8个字节。
(2). 在insert和update维表时都加上一个条件来过滤维表中已经存在的记录,例如:
insert into dim_customer select * from ods_customer where ods_customer.code not exists (dim_customer.code)
ods_customer为数据源表。dim_customer为维表。
(3). 使用显式的游标,因为隐式的游标将会执行两次操作,第一次检索记录,第二次检查too many rows这个exception,而显式游标不执行第二次操作。
3.數據抽取的sql优化:
(1). Where 子句中的连接顺序:
oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前,那些可以过滤掉大量记录的条件必须写在where子句的末尾。如:
低效:select * from emp e where sal>5000 and job = ‘manager’ and 25 高效:select * from emp e where 255000 and job=’manager’;
(2). 删除全表时,用truncate 替代 delete,同时注意truncate只能在删除全表时适用,因为truncate是ddl而不是dml。
常见的DDL语句:CREATE DATABASE,CREATE TABLE,ALTER TABLE ,DROP TABLE,CREATE VIEW,ALTER VIEW ,DROP VIEW 等
而insert,delete,update,select(插入、删除、修改、检索)等都是DML.
(3). 尽量多使用commit
只要有可能就在程序中对每个delete,insert,update操作尽量多使用commit,这样系统性能会因为commit所释放的资源而大大提高。
(4). 用exists替代in ,可以提高查询的效率。
(5). 用not exists 替代 not in
(6). 优化group by
提高group by语句的效率,可以將不需要的记录在group by之前过滤掉。如:
低效:select job, avg(sal) from emp group by job having job = ‘president’ or job=’manager’;
高效: select job, avg(sal) from emp having job=’president’ or job=’manager’ group by job;
(7). 有条件的使用union-all 替代 union:这样做排序就不必要了,效率会提高3到5倍。
(8). 分离表和索引
总是將你的表和索引建立在不同的表空间内,絕不要將不属于oracle内部系统的对象存放到system表空间内。同时确保数据表空间和索引表空间置于不同的硬盘控制卡控制的硬盘上。
Oracle9i新特性
Oracle9i新特性
Oracle对Oracle9i SQL 做了一些很重要的改进,包括一些令人兴奋的新特点,支持1:5的数量级和ISO99中的SQL标准。作为Oracle的补充,它包括以下新的TABLE JOIN的句法结构:
CROSS JOIN――它在两个表格中创建了一个卡迪尔列,就象是在Oracle8i中没写WHERE时那样。
NATURAL JOIN――这是一个很有用的Oracle9i的句法,它通过从WHERE子句中移动连接标准来改善SQL的稳定性
USING子句――它可以通过名字来具体指定连接
ON子句――这个句法允许在两个表格中为连接具体指定栏目的名头
LEFT OUTER JOIN――它返回表格中左边的行和右边的数值,如果没有搭配的行的话,则返回零
RIGHT OUTER JOIN――它返回表格中右边的行和左边的数值,如果没有搭配的行的话,则返回零
FULL OUTER JOIN――它返回的是两个表格中所有的行,用零填满每一个空格。这在Oracle8i中则没有相应的此种句法
大多数改进都是为了让那些非Oracle的请求以快速的进入Oracle数据库而引进的,并且必须记住这些只是句法上的不同,ISO99标准并没有给Oracle9i SQL带来任何新的功能。
The CROSS JOIN
在Oracle中,CROSS JOIN产生了一个“卡迪尔的产物(Cartesian product)”,就象是在连接两个表格时忘记加入一个WHERE子句一样
select last_name,dept_id
from emp,depts;
在Oracle9i中,我们使用CROSS JOIN 来达到相同的结果
select last_name.dept_id
from emp
CROSS JOIN dept;
NATURAL JOIN
能够通过在两个表格中配对的栏目的名头来自动的检查join。它同时还简化了Oracle9i SQL,由于where子句仅仅只能过滤谓语,当然,NATURAL JOIN要求在每一个表格中的栏目的名字相同。很有意思的是,这种特性甚至在没有主要的或是外来的关键词作为参考是也能起作用
Oracle8i,
Select book_title, sum(quantity)
From book, sales
Where book.book_id = sales.book_id
group by book_title;
Oracle9i
Select book_title, sum(quantity)
from book
natural join sales
group by book_title;
USING子句
假如几个栏目有同样的名字,而你又不想用所有的这些栏目来连接的时候,你就可以用USING子句。在USING子句中所列的栏目的句子中不会有任何的修饰词,包括where子句也不会有
Oracle8i
select dept_id, city
from departments,locations
where departments.location_id = location.location_id;
Oracle9i
select department_name, city
from departments
JOIN locations
USING (location_id);
ON子句
ON子句被用于当在两个表格中的栏目名字不搭配时来连接表格。而连接条件就是where子句中的过滤条件
Oracle8i
select department_name, city
from department, location
where department.location_id = location.loc_id;
Oracle9i
select department_name, city
from department d
JOIN location l
ON (d.location_id = l.id);
易变的连接
易变的连接就是两个以上的表格被连接所用的。ISO SQL 1999标准通常假设表格从左至右连接,连接的条件是能够为现在的连接或以前的与左边的连接相关联的栏目提供参考。
Oracle8i
select emp_id, city_name, dept_name
from location l, department d, emp e
where d.location_id = l.location_id
and d.department_id = e.department_id;
Oracle9i
select emp_id, city_name, dept_name
from locations l
JOIN departments d ON (d.location_id = l.location_id)
JOIN employees e ON (d.department_id = e.department_id);
新的OUTER JOIN句法
ISO99标准把复杂的加号从Oracle outer join中拿出去,并使得outer join SQL更容易理解。
LEFT OUTER JOIN
在LEFT OUTER JOIN中,会返回所有左边表格中的行,甚至在被连接的表格中没有可配对的栏目的情况下也如此。在下边的例子中,返回了所有雇员的姓,甚至包括了那些没有分配到部门的雇员。
Oracle8i
select last_name, dept_id
from emp e, dept d
where e.department_id = d.department_id(+);
Oracle9i
select last_name, dept_id
from emp
LEFT OUTER JOIN Dept
ON e.dept_id = d.dept_id;
RIGHT OUTER JOIN
在RIGHT OUTER JOIN中返回的是表格中所有右边的行,甚至在被连接的表格中没有可配对的栏目的情况下也如此。在这个例子中,返回了所有部门的ID,包括那些没有一个雇员的的部门。
Oracle8i
select last_name, d.dept_id
from employees e, departments d
where e.department_id(+) = d.department_id;
Oracle9i
select last_name, d.dept_id
from employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
总结
ISO99标准是Oracle改进SQL工具的另一个例子。NATURAL JOIN LEFT OUTER JOIN 和 RIGHT OUTER JOIN是这些改进中最受欢迎的,它们分别简化了SQL句法以及消除了对于复杂句法(比如+)的需要。
分享按钮delphi 開發與文件相關應用常用的方法
文件相關函數使用方法
1) copyfile
把源文件copy到目的处(即把文件從一個地方拷貝到另一個地方)
若後面的屬性為false則每次會自動用源處的文件覆蓋目的處的文件
CopyFile(pchar(sTempFileName),pchar(sSaveFile),false);
例: copyfile(‘G:\sfcexe\LOCAL_SIM87.EXE’,'C:\acbelap\LOCALDB\LOCAL_SIM87.EXE’,false);
若為true則若目的處不存在要拷貝的文件時會自動拷貝,但若存在則不能覆蓋
2) directoryexists
DirectoryExists这个函数在FileCtrl单元文件中定义,所以你需要手动在源文件开头的uses里加入对这个单元库的引用: Uses FileCtrl,判斷目錄是否存在
例:若要知道C:\ACBELAP是否存在在需要用directoryexists函數,用FileExists就不可以
3) FileExists
判斷文件目錄下的文件是否存在,若存在則返回的是true,若不存在則返回的是false
若要判斷一個文檔是否存在則用FileExists,
如想知道 C:\ACBELAP\ TRANSMIT_DATA\DATA.TXT是否存在就要用fileexists 不能用directoryexists
4) deletefile
刪除一個已經存在的文件,注意若文件不存在則會出錯,刪除前要先判斷下文件是否存在
5) AssignFile
AssignFile(BAT,’C:\123.TXT’) ;指定創建的文檔類型和定義的文檔名稱,如AssignFile(BAT,’C:\123.TXT’)則表面文檔類型為TXT,名稱為123
如
AssignFile(BAT,’C:\123.XLS)則表示文檔類型為EXCEL表格類型,文檔名稱為123
6)REWRITE
以只寫的方式打開文件,若文件不存在會自動創建,如在WRITELN前面就要用rewrite打開下文件,供寫入數據,並且會覆蓋之前已經有的數據!
7)RESET
已只讀的方式打開文件,並且文件要已經存在的,
AssignFile(BAT,’C:\BOBO.TXT’) ;
RESET(BAT);
若文件不存在則會提示
若在RESET後用 WRITELN 函數則會提示
,因為RESET是以只讀方式打開,不可往裏面寫入數據

filecreate
返回值是數字型,若返回的是正數則是對的,若返回的是負數則表明是錯誤的!
9)closefile
關閉已經打開的文件
10) READLN
讀取內容,注意在讀取之前要先打開文件用RESET,不能用REWRITE,REWRITE是以只寫的方式打開文件
若在READLN前面不用RESET就會出現如下錯誤:
11) MKDIR
創建子目錄:
如: IF NOT directoryexists(‘C:\acbelap\TRANSMIT_DATA’) THEN
MKDIR(‘C:\acbelap\TRANSMIT_DATA’);
就是判斷目錄是否存在,若不存在就用MKDIR創建子目錄,也可用
createdir(‘C:\acbelap\TRANSMIT_DATA’);,createdir也可用來創建子目錄
12) APPEND 追加
使用APPEND往指定的文檔裏面添加數據一定要在文檔存在的情況下才可以添加,並且是在已有的記錄後面追加記錄,不會把之前的記錄覆蓋!
DataGridView二维表头实例
RowMergeView.cs文件内容:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Design;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;
/// <summary>
/// DataGridView行合并.请对属性MergeColumnNames 赋值既可
/// </summary>
public partial class RowMergeView : DataGridView
{
#region 构造函数
public RowMergeView()
{
InitializeComponent();
}
#endregion
#region 重写的事件
protected override void OnPaint(PaintEventArgs pe)
{
// TODO: 在此处添加自定义绘制代码
// 调用基类 OnPaint
base.OnPaint(pe);
}
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
try
{
if (e.RowIndex > -1 && e.ColumnIndex > -1)
{
DrawCell(e);
}
else
{
//二维表头
if (e.RowIndex == -1)
{
if (SpanRows.ContainsKey(e.ColumnIndex)) //被合并的列
{
//画边框
Graphics g = e.Graphics;
e.Paint(e.CellBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border);
int left = e.CellBounds.Left, top = e.CellBounds.Top + 2,
right = e.CellBounds.Right, bottom = e.CellBounds.Bottom;
switch (SpanRows[e.ColumnIndex].Position)
{
case 1:
left += 2;
break;
case 2:
break;
case 3:
right -= 2;
break;
}
//画上半部分底色
g.FillRectangle(new SolidBrush(this._mergecolumnheaderbackcolor), left, top,
right - left, (bottom - top) / 2);
//画中线
g.DrawLine(new Pen(this.GridColor), left, (top + bottom) / 2,
right, (top + bottom) / 2);
//写小标题
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
g.DrawString(e.Value + "", e.CellStyle.Font, Brushes.Black,
new Rectangle(left, (top + bottom) / 2, right - left, (bottom - top) / 2), sf);
left = this.GetColumnDisplayRectangle(SpanRows[e.ColumnIndex].Left, true).Left - 2;
if (left < 0) left = this.GetCellDisplayRectangle(-1, -1, true).Width;
right = this.GetColumnDisplayRectangle(SpanRows[e.ColumnIndex].Right, true).Right - 2;
if (right < 0) right = this.Width;
g.DrawString(SpanRows[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Black,
new Rectangle(left, top, right - left, (bottom - top) / 2), sf);
e.Handled = true;
}
}
}
base.OnCellPainting(e);
}
catch
{ }
}
protected override void OnCellClick(DataGridViewCellEventArgs e)
{
base.OnCellClick(e);
}
#endregion
#region 自定义方法
/// <summary>
/// 画单元格
/// </summary>
/// <param name="e"></param>
private void DrawCell(DataGridViewCellPaintingEventArgs e)
{
if (e.CellStyle.Alignment == DataGridViewContentAlignment.NotSet)
{
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
}
Brush gridBrush = new SolidBrush(this.GridColor);
SolidBrush backBrush = new SolidBrush(e.CellStyle.BackColor);
SolidBrush fontBrush = new SolidBrush(e.CellStyle.ForeColor);
int cellwidth;
//上面相同的行数
int UpRows = 0;
//下面相同的行数
int DownRows = 0;
//总行数
int count = 0;
if (this.MergeColumnNames.Contains(this.Columns[e.ColumnIndex].Name) && e.RowIndex != -1)
{
cellwidth = e.CellBounds.Width;
Pen gridLinePen = new Pen(gridBrush);
string curValue = e.Value == null ? "" : e.Value.ToString().Trim();
string curSelected = this.CurrentRow.Cells[e.ColumnIndex].Value == null ? "" : this.CurrentRow.Cells[e.ColumnIndex].Value.ToString().Trim();
if (!string.IsNullOrEmpty(curValue))
{
#region 获取下面的行数
for (int i = e.RowIndex; i < this.Rows.Count; i++)
{
if (this.Rows[i].Cells[e.ColumnIndex].Value.ToString().Equals(curValue))
{
//this.Rows[i].Cells[e.ColumnIndex].Selected = this.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected;
DownRows++;
if (e.RowIndex != i)
{
cellwidth = cellwidth < this.Rows[i].Cells[e.ColumnIndex].Size.Width ? cellwidth : this.Rows[i].Cells[e.ColumnIndex].Size.Width;
}
}
else
{
break;
}
}
#endregion
#region 获取上面的行数
for (int i = e.RowIndex; i >= 0; i--)
{
if (this.Rows[i].Cells[e.ColumnIndex].Value.ToString().Equals(curValue))
{
//this.Rows[i].Cells[e.ColumnIndex].Selected = this.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected;
UpRows++;
if (e.RowIndex != i)
{
cellwidth = cellwidth < this.Rows[i].Cells[e.ColumnIndex].Size.Width ? cellwidth : this.Rows[i].Cells[e.ColumnIndex].Size.Width;
}
}
else
{
break;
}
}
#endregion
count = DownRows + UpRows - 1;
if (count < 2)
{
return;
}
}
if (this.Rows[e.RowIndex].Selected)
{
backBrush.Color = e.CellStyle.SelectionBackColor;
fontBrush.Color = e.CellStyle.SelectionForeColor;
}
//以背景色填充
e.Graphics.FillRectangle(backBrush, e.CellBounds);
//画字符串
PaintingFont(e, cellwidth, UpRows, DownRows, count);
if (DownRows == 1)
{
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
count = 0;
}
// 画右边线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom);
e.Handled = true;
}
}
/// <summary>
/// 画字符串
/// </summary>
/// <param name="e"></param>
/// <param name="cellwidth"></param>
/// <param name="UpRows"></param>
/// <param name="DownRows"></param>
/// <param name="count"></param>
private void PaintingFont(System.Windows.Forms.DataGridViewCellPaintingEventArgs e, int cellwidth, int UpRows, int DownRows, int count)
{
SolidBrush fontBrush = new SolidBrush(e.CellStyle.ForeColor);
int fontheight = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Height;
int fontwidth = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Width;
int cellheight = e.CellBounds.Height;
if (e.CellStyle.Alignment == DataGridViewContentAlignment.BottomCenter)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + (cellwidth - fontwidth) / 2, e.CellBounds.Y + cellheight * DownRows - fontheight);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.BottomLeft)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X, e.CellBounds.Y + cellheight * DownRows - fontheight);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.BottomRight)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + cellwidth - fontwidth, e.CellBounds.Y + cellheight * DownRows - fontheight);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.MiddleCenter)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + (cellwidth - fontwidth) / 2, e.CellBounds.Y - cellheight * (UpRows - 1) + (cellheight * count - fontheight) / 2);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.MiddleLeft)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X, e.CellBounds.Y - cellheight * (UpRows - 1) + (cellheight * count - fontheight) / 2);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.MiddleRight)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + cellwidth - fontwidth, e.CellBounds.Y - cellheight * (UpRows - 1) + (cellheight * count - fontheight) / 2);
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.TopCenter)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + (cellwidth - fontwidth) / 2, e.CellBounds.Y - cellheight * (UpRows - 1));
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.TopLeft)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X, e.CellBounds.Y - cellheight * (UpRows - 1));
}
else if (e.CellStyle.Alignment == DataGridViewContentAlignment.TopRight)
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + cellwidth - fontwidth, e.CellBounds.Y - cellheight * (UpRows - 1));
}
else
{
e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, fontBrush, e.CellBounds.X + (cellwidth - fontwidth) / 2, e.CellBounds.Y - cellheight * (UpRows - 1) + (cellheight * count - fontheight) / 2);
}
}
#endregion
#region 属性
/// <summary>
/// 设置或获取合并列的集合
/// </summary>
[MergableProperty(false)]
[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible)]
[Localizable(true)]
[Description("设置或获取合并列的集合"), Browsable(true), Category("单元格合并")]
public List<string> MergeColumnNames
{
get
{
return _mergecolumnname;
}
set
{
_mergecolumnname = value;
}
}
private List<string> _mergecolumnname = new List<string>();
#endregion
#region 二维表头
private struct SpanInfo //表头信息
{
public SpanInfo(string Text, int Position, int Left, int Right)
{
this.Text = Text;
this.Position = Position;
this.Left = Left;
this.Right = Right;
}
public string Text; //列主标题
public int Position; //位置,1:左,2中,3右
public int Left; //对应左行
public int Right; //对应右行
}
private Dictionary<int, SpanInfo> SpanRows = new Dictionary<int, SpanInfo>();//需要2维表头的列
/// <summary>
/// 合并列
/// </summary>
/// <param name="ColIndex">列的索引</param>
/// <param name="ColCount">需要合并的列数</param>
/// <param name="Text">合并列后的文本</param>
public void AddSpanHeader(int ColIndex, int ColCount, string Text)
{
if (ColCount < 2)
{
throw new Exception("行宽应大于等于2,合并1列无意义。");
}
//将这些列加入列表
int Right = ColIndex + ColCount - 1; //同一大标题下的最后一列的索引
SpanRows[ColIndex] = new SpanInfo(Text, 1, ColIndex, Right); //添加标题下的最左列
SpanRows[Right] = new SpanInfo(Text, 3, ColIndex, Right); //添加该标题下的最右列
for (int i = ColIndex + 1; i < Right; i++) //中间的列
{
SpanRows[i] = new SpanInfo(Text, 2, ColIndex, Right);
}
}
/// <summary>
/// 清除合并的列
/// </summary>
public void ClearSpanInfo()
{
SpanRows.Clear();
//ReDrawHead();
}
private void DataGridViewEx_Scroll(object sender, ScrollEventArgs e)
{
if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)// && e.Type == ScrollEventType.EndScroll)
{
timer1.Enabled = false; timer1.Enabled = true;
}
}
//刷新显示表头
public void ReDrawHead()
{
foreach (int si in SpanRows.Keys)
{
this.Invalidate(this.GetCellDisplayRectangle(si, -1, true));
}
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
ReDrawHead();
}
/// <summary>
/// 二维表头的背景颜色
/// </summary>
[Description("二维表头的背景颜色"), Browsable(true), Category("二维表头")]
public Color MergeColumnHeaderBackColor
{
get { return this._mergecolumnheaderbackcolor; }
set { this._mergecolumnheaderbackcolor = value; }
}
private Color _mergecolumnheaderbackcolor = System.Drawing.SystemColors.Control;
#endregion
}
使用时调用:
rowMergeView1.AddSpanHeader(7, 4, "表头标题")
7为开始列,4为所跨列数。
分享按钮
淘宝客网站备案通过,推荐一个免费的空间给大家。
等了快2个月了,前几天才收到备案退回的邮件。
问了下代备案的服务商,说是少了一个文件。
怎么能这样子,不过好在服务商马上补发了文件过去,备案就下来了。
http://www.fasttao.net就是我淘宝客的网站了,用的是店盟淘宝客程序,感觉还是有些问题,现在备案下来也没太多时间去弄,先放着。
朋友们可以进去看下。呵呵
接下来给朋友们推荐的一款空间是德国的com.nu空间,还赠送Mysql空间都足够了。而且有中文,这点确实不错。
想尝试做网站的可以先用用。就是有一点,访问起来有点慢,而且有广告(可以破解去掉)。
另转载破解广告方法:
第一种:
在页面</body>前加上<noscript> ,在</html>后面也加上<noscript> ,现在结构就变成了:
<noscript>
</body>
</html>
<noscript>
如果安装的是WordPress,则可以采用上述方法对主题模版下的footer.php和管理界面的admin-footer.php进行修改。但是最好还是把footer.php、admin-footer.php的属性改为只读(444),以防反弹!
第二种:
去广告的代码比较简单 只要在尾部加入下列代码即可:
* <div id=”noAds” >
<script language=”javascript” type=”text/javascript”>document.getElementById(“noAds”).style.display=”none”;</script>
记住,<div>不要加后面的</div>括号,只要一半就OK了!
耒阳,秋风…继续奋斗
秋风,凉意来袭。吹走的不是夏日炎炎而是一腔的创业激情。继续累积创业经验。
分享按钮管理经验
森林之王狮子聘请豹子帮他管理10只狼。
在上岗的第一天,狮子就给了豹子一大块肉并让他分给狼。
豹子把肉平均分成了11份,自己拿一份,其他都分给了狼群。大家都相安无事。
在上岗的第二天,狮子又给了豹子一大块肉并让他分给狼,但是很明显肉比昨天的少了。
豹子照旧把肉平均分成11份,自己拿一份,其他都分给了狼群。狼群开始有意见:豹子不用做事情还跟我们吃一样多,这样太不公平了。狼的不满情绪愈演愈烈。
在上岗的第三天,狮子又给了豹子一块肉并让他分给狼,这次肉的分量却只够填饱2只动物的肚子。
豹子照旧把肉平均分成11份,自己拿一份,其他都分给了狼群。狼群看到肉的分量。纷纷向豹子发难。最终在狼群团结一致的情况下。豹子不得不把自己的肉交出来。
第4天,豹子直接向狮子提出辞职。他说10只狼他无法管理。并且向狮子说明了他管理的方式。这个时候狮子又拿出了一块肉,分量和第一天的一样。
狮子把肉分成了11份,并且大小不均,自己拿了一块最大的。其他的抛向狼群。这个时候狼群都在为拿到最大的那块肉战斗。并没有狼提出意见。
豹子很佩服,问狮子这叫什么方法,狮子说“有木有听过人类的绩效工资”
而后狮子又拿出一块和第2天分量一样的肉,分成了10份,同样是大小不均,自己拿了最大的一块。同样狼还是为了自己的那一份食物战斗。最后一条弱小的狼没有分的食物。
豹子很佩服,问狮子这叫什么方法。狮子说“有木有听过末位淘汰法则”
最后狮子又拿出了一块肉,分量和第三天的一样。狮子把肉份成了2份。自己拿一块。其他抛向狼群。最后狼群中最强壮的狼打败了其他所有狼并且吃掉那块肉。
豹子很佩服,问狮子这叫什么方法。狮子说“有木有听过竞争上岗”
分享按钮
地磅程序实例片段[源代码]
最后加的读取ini配置文件功能:
—————————————————————
[DllImport("kernel32.dll")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32.dll")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); public static string inifilepath = Application.StartupPath.ToString() + @"\config.ini";//配置文件名称和存放地址 public static string server = IniReadValue("settings", "databasepath", inifilepath);//数据库连接字符串 public static int iPort = int.Parse(IniReadValue("settings", "Port", inifilepath));//COM口号 public static int iRate = int.Parse(IniReadValue("settings", "Rate", inifilepath));//波特率 public static byte bSize = byte.Parse(IniReadValue("settings", "Size", inifilepath));//数据大小 public static byte bParity = byte.Parse(IniReadValue("settings", "Parity", inifilepath));//奇偶校验 public static byte bStopBits = byte.Parse(IniReadValue("settings", "StopBits", inifilepath));//停止位 public static string BackUpPath = IniReadValue("settings", "backupPath", inifilepath);//数据清理备份存放路径 public static string DATAPATH = IniReadValue("settings", "DATAPath", inifilepath);//数据存放路径 public static void IniWriteValue(string Section, string Key, string Value, string filepath)//对ini文件进行写操作的函数 { WritePrivateProfileString(Section, Key, Value, filepath); } public static string IniReadValue(string Section, string Key, string filepath)//对ini文件进行读操作的函数 { StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString(Section, Key, "", temp, 255, filepath); return temp.ToString(); } public int isbl; public int iTimeout = 1000; public string rstr="0";//最后一次正确读数 public mycom mycom1 = new mycom(); public byte[] recb; public byte[] recb1; |
—————————————————————
使用时钟控件检测地磅重量变化
—————————————————————
private void timer1_Tick(object sender, EventArgs e) { textBox12.Text = "";//textBox12用来显示地磅重量 recb = null; //存放通过COM口接收的字符串 mycom1.Close(); //关闭COM连接实例 mycom1.Open(); //打开COM连接实例 recb = mycom1.Read(9);//通过COM口接收的字符串,保存9位 try { rstr = Convert.ToString(Convert.ToInt32(aConvert(aToInt(recb)))); textBox12.Text = rstr;//把正确输出的重量保存,(在实际使用过程中会出现乱码) } catch { textBox12.Text = rstr;//出现异常情况(出现乱码)的时候,显示最后一次正确的重量! } } |
—————————————————————
把COM口接收的数据连接成数字
aToInt方法
public string aToInt(byte[] reb) { string temp = ""; for (int i = 1; i <= 8; i++) { temp += Convert.ToString((char)reb[i]); } return temp; } |
—————————————————————
把连接好的数字重新排序
aConvert方法
public string aConvert(string rtemp) { string atemp = ""; int len = rtemp.Length; for (int i = 1; i <= len; i++) { atemp += rtemp.Substring(len - i, 1); } return atemp; } |
—————————————————————
就这些代码加上一个COMM.Dll接口和kernel32.dll实现 上海耀华xk3190-d2 地磅仪表与计算机的通讯。
分享按钮




