随笔-7  评论-15  文章-22  trackbacks-0
  置顶随笔
posted @ 2006-07-15 18:13 流浪狗 阅读(1244) 评论(2) 编辑
posted @ 2006-07-15 18:10 流浪狗 阅读(1109) 评论(4) 编辑
  2007年4月5日
密码: AAP5GKS0000GHE100UM
注册码:6078043616
                6110167826
                AAP50GS0000GSG80038

您的注册号是 6275350665
您的新密钥是 AAP5GKS0000GBB100C9
这是9.2的license key :
AVS50-81SG00S-G61002U 1236731231
9999999991
0019250903
0004400007
1112411119

posted @ 2007-04-05 23:47 流浪狗 阅读(1131) 评论(1) 编辑
  2006年11月3日

通常,我们在开发一个项目时,希望把所有的工程都统一地放到解决方案目录之下,把它们组织到VSS上时,目录结构也是如此。

但是,当我们在一台新的机器上从VSS上获取了所有的源代码目录及文件后,并将对应的ASP.NET工程所在的目录设定为IIS虚拟目录,在打开解决方案时,总是会提示我们虚拟目录已经存在,并且会自动给一个建议的重命名。这时我们通常的做法有可能是从解决方案中移除这个工程,然后重新将已经存在的工程添加进来,使用非常的不方便。

虽然原因我现在还不知道,不过经过多次偿试,总算找到了一个解决方法,赶紧共享给大家,不免有些贻笑大方哦。

解决步骤:

  1. 从VSS上获取解决方案目录结构及文件到本地机器指定的工作目录中;
  2. 将ASP.NET工程所在的目录设定为我们所需要的虚拟目录,注意要设定位应用程序。
  3. 在完成上面的设定后,把我们获取到的ASP.NET工程的目录删除掉,这个时候虽然目录没有了,但是在IIS上仍然有一个虚拟目录指向该路径。
  4. 打开解决方案,会提示连接到VSS服务器。当连接到VSS服务器时,会自动将ASP.NET工程从VSS上获取到本地我们所指定的虚拟目录的路径中,而再也不会提示原来的问题。

当然,这种方法只对连接到VSS服务器打开工程时有效,对于断开连接,可能是无效的。如果你直接把ASP.NET工程文件放到虚拟目录的根目录下,有可能也不会出现这样的问题,但我们的所有代码都不是统一地存在于解决方案所在的目录下了。

posted @ 2006-11-03 09:11 流浪狗 阅读(825) 评论(0) 编辑
  2006年7月15日
  1. 背景:
    在我们的应用中,经常使用 Windows.Forms.DataGrid 控件用于显示大批量的数据。
    然而,当我们在批量修改 DataGrid 所绑定数据源时,极大可能引发一个 DataGrid 的绘制异常,异常信息如下所示:

    System.NullReferenceException: Object reference not set to an instance of an object.
       at System.Data.DataColumnPropertyDescriptor.GetValue(Object component)
       at System.Windows.Forms.DataGridColumnStyle.GetColumnValueAtRow(CurrencyManager source, Int32 rowNum)

       at System.Windows.Forms.DataGridTextBoxColumn.Paint(Graphics g, Rectangle bounds, CurrencyManager source, Int32 rowNum, Brush backBrush, Brush foreBrush, Boolean alignToRight)
       at System.Windows.Forms.DataGridRelationshipRow.PaintCellContents(Graphics g, Rectangle cellBounds, DataGridColumnStyle column, Brush backBr, Brush foreBrush, Boolean alignToRight)
       at System.Windows.Forms.DataGridRow.PaintData(Graphics g, Rectangle bounds, Int32 firstVisibleColumn, Int32 columnCount, Boolean alignToRight)
       at System.Windows.Forms.DataGridRelationshipRow.Paint(Graphics g, Rectangle bounds, Rectangle trueRowBounds, Int32 firstVisibleColumn, Int32 numVisibleColumns, Boolean alignToRight)
       at System.Windows.Forms.DataGrid.PaintRows(Graphics g, Rectangle& boundingRect)
       at System.Windows.Forms.DataGrid.PaintGrid(Graphics g, Rectangle gridBounds)
       at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe)
       at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
       at System.Windows.Forms.Control.WmPaint(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


  2. 问题分析:
    经过各种解决方案的测试,最后发现是因为在批量更新 DataGrid 所绑定的数据源时,每次更新都会导致 Grid 发生重绘;而当数据更新速度非常快或者其它原因,导致 UI 线程来不及绘制完毕 DataGrid 时,Grid 就会发生绘制错误。
    请注意异常信息中加亮显示的部分。
  3. 解决方法:根据上面分析推测出来的原因,基本上就是尽量减少因为数据源的变更而导致 DataGrid 重新发生绘制,从而避免因绘制过程中出错。因此,使用下面的步骤,从而使问题得以解决。
    1. 从原来的数据源中Clone一个数据源出来,用来做 Save 操作的数据源,这样就使在Save 操作时,对数据源的更新与 DataGrid 所绑定的数据源分离开来,而不会导致 Grid 被刷新;
    2. 在Save 完毕后,断开 DataGrid 与数据源之间的绑定;
    3. 把 Clone 出来保存了 Save 的结果的数据源 Merge 回原来的数据源中,并更新相应的状态;
    4. 重新将 DataGrid 绑定到数据源,这将使 Grid 只发生一次绘制行为。
  4. 总结:
    我们在大量刷新控件绑定的数据源时,可能通过临时断开与数据源之间的绑定,抑制控件发生频繁重绘。在更新数据源完成后,再恢复控件与数据之间的绑定,从而使控件仅需绘制一次即可显示数据。
    由于 DataGrid 不提供与数据源断开的功能,例如 C1FlexGrid 可以使用 BeginInit() / EndInit() 方法对来提供暂时与数据源断开绑定/恢复绑定的功能,因此,需要手工处理其与数据源的断开/恢复功能,那就是移除  DataSource 属性的置,在数据源更新完毕后,再重新设置DataSource的值。
    事实上,Control基类提供了一个 public virtual 的方法对 BeginInit/EndInit,来提供这方面的支持,仅管 MSDN 文档中并没有如此说明,但在 DataGrid 中完全可以重写这两个方法提供这个功能。但遗憾的是,微软并没有这样做,这又增加了一个  DataGrid 被人诟病的理由,因此,在 .NET 2.0 中,微软新提供了一个替代控件 DataGridView,不过,本人还未仔细地去研究这个控件所提供的功能与改变。
posted @ 2006-07-15 18:13 流浪狗 阅读(1244) 评论(2) 编辑
posted @ 2006-07-15 18:10 流浪狗 阅读(1109) 评论(4) 编辑
  2006年1月7日
   我们在设计水晶报表时,经常会因为修改了水晶报表所依赖的DataSet架构,而需要刷新报表中的Database Fields。由于有许多人不知道如何进行刷新,而采用了一种比较“暴力”的方式,即移除原来的Database Fields,然后重新进行加载,这会带来一个问题,即在移除时将删除所有已经加载到报表页面上的数据字段,破坏了报表原来的设计样式。

如何解决?

    由于这方面很难找到比较详细的文档说明,以下是自己通过试控而找到的方法,以供参考:

  1. 首先,编译强类型DataSet所在的工程,因为水晶报表是通过反射机制从程序集中提取DataSet架构的,即使它和报表在同一个工程中。
  2. 打开报表设计文件,在其Field Explorer中,用鼠标右击Database Fields结点,打开弹出菜单,并选择Log On/Off Server...项,将打开Data Explorer窗口。
  3. 在Data Explorer窗口中,选择左边树中的Project Data->Current Connection节点,选择当前报表所引用的DataSet,点击Log Off按钮,将断开与数据源的连接,此时该结点下被选中Log off 的DataSet将消失不见。
    接着,展开Project Data->ADO.NET DataSet结点,在展开时,报表设计器会自动寻找报表所在程序集中包含和其引用的程序集中所包含的所有强类型的DataSet派生类。选中报表所引用的DataSet,点击Log On按钮,将重新建立与数据源的连接。此时,收缩Current Connection结点然后重新展开,将看到所引用的DataSet被重新显示出来。
  4. 关闭上面的窗口,回到 Fields Explorer,在 Database Fields 结点上打开弹出菜单,选择 Set Location项打开 Set Location 窗口。
    在Set Location中,从 Current Data Source 中选择要刷新的 DataSet 或 Table ,并从Replace with.的树中选择所引用的 DataSet 或其中对应的 Table,点击 Replace 按钮,将使用最新的 DataSet 架构替换水晶报表中原来存在的DataSet 架构。
    所有需要更新的DataSet都做完后,关闭窗口。
  5. 在 Fields Explorer 中,展开 Database Fields 下面的子结点,看看所有的架构(字段)是不是已经更新了!

   这种方式,可以在更新了DataSet架构后,而不用破坏原来报表中已经存在的设计,当然原来某个字段已经被删除了的情况除外了!

--End--

posted @ 2006-01-07 14:51 流浪狗 阅读(1913) 评论(3) 编辑
  2005年12月17日

       前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片。但是,水晶报表只支持OleDb的静态加载图片和动态在 IFieldObject中显示图片,显然,静态加载是不行的了,而后者仅支持JPEG和BMP格式的图片。因此,我们需要把任意格式的图片预先转换成受支持的JEPG或BMP格式,再填充到DataSet中,然后动态地推入到水晶报表中。

      下面的示例中将讲述如何将一个给定路径或从其它途径得到的一个图片流转换成JPEG格式并返回成一个字节数组,以提供给后续应用:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Common
{
    
/// <summary>
    
/// 与图像相关的工具类。
    
/// </summary>

    public class ImageUtil
    
{
        
public ImageUtil()
        
{
        }


        
/// <summary>
        
/// 从指定路径中读取一个图像文件并保存到字节数组中。
        
/// 此方法供水晶报表显示图片使用,所返回字节数组是 BMP 或 JEPG 格式图像数据的数组。
        
/// </summary>
        
/// <param name="path">指定的文件路径</param>
        
/// <returns>从图像中读取出的数据。</returns>

        public static byte[] ReadImage(string path)
        
{
            FileStream stream 
= null;
            
try
            
{
                stream 
= File.OpenRead(path);
                
return ReadImage(stream);
            }

            
finally
            
{
                
if(stream != null)
                
{
                    stream.Close();
                }

            }

        }


        
/// <summary>
        
/// 从给定的流中读取数据到一个字节数组中,并返回此数组。
        
/// 如果给定的流不是一个图像格式的流,将报异常。
        
/// 返回的字节数组中,将非BMP和JEPG格式的图像数据流转换为JEPG格式输出,以支持大多数应用。
        
/// 适用于直接从数据库中读取的二进制图像流的处理。
        
/// </summary>
        
/// <param name="stream">给定的图像数据流。</param>
        
/// <returns>从流中读取的数据。</returns>

        public static byte[] ReadImage(Stream stream)
        
{
            Image image 
= Image.FromStream(stream);
            
byte[] myImage = null;

            
if(image.RawFormat.Guid != ImageFormat.Jpeg.Guid && image.RawFormat.Guid != ImageFormat.Bmp.Guid)
            
{
                MemoryStream memStream 
= new MemoryStream();
                image.Save(memStream, ImageFormat.Jpeg);
                myImage 
= memStream.GetBuffer();
                memStream.Close();
            }

            
else
            
{
                stream.Position 
= 0;
                myImage 
= new byte[stream.Length];
                stream.Read(myImage, 
0, (int)stream.Length);
            }

            
return myImage;
        }

    }

}

下面是应用上面代码的一个示例(非完整):

 1private void Form7_Load(object sender, System.EventArgs e)
 2        {
 3            string[] etc = new string[]{"jpg""gif""bmp""tif""png"};
 4            string path = @"C:\Documents and Settings\sh12\My Documents\My Pictures\NeweggLogo.";
 5            try
 6            {
 7                byte[] myImage = null;
 8
 9                Dataset2 ds = new Dataset2();
10                DataRow drNew = null;
11                for(int i=0; i<etc.Length; i++)
12                {
13                    myImage = Newegg.Common.ImageUtil.ReadImage(path + etc);
14
15                    drNew = ds.MyTable.NewRow();
16                    drNew["ImageType"= etc;
17                    drNew["ImageData"= myImage;
18                    ds.MyTable.Rows.Add(drNew);
19                }

20
21                myImage = Newegg.Common.ImageUtil.ReadImage(@"C:\Documents and Settings\sh12\My Documents\My Pictures\untitled.JPG");
22                drNew = ds.MyTable.NewRow();
23                drNew["ImageType"= "untitled.JPG";
24                drNew["ImageData"= myImage;
25                ds.MyTable.Rows.Add(drNew);
26
27                ds.AcceptChanges();
28
29                CrystalReport1 rpt = new CrystalReport1();
30                rpt.SetDataSource(ds);
31                this.crystalReportViewer1.ReportSource = rpt;
32            }

33            catch(Exception ex)
34            {
35                MessageBox.Show(ex.Message);
36            }

37        }

其实这个实现非常简单,思路也容量想到。只是,还是希望能够给大家提供一些帮助或启迪了。

谢谢大家的阅读!

请指正! 

posted @ 2005-12-17 12:43 流浪狗 阅读(4346) 评论(3) 编辑
  2005年12月13日
摘要: 我的心情十分的激动,终于来到了这个博客的世界!希望在这里有激情的付出、丰满的收获、美丽的邂逅!阅读全文
posted @ 2005-12-13 12:27 流浪狗 阅读(147) 评论(2) 编辑
仅列出标题