摘要: 弄着玩.还蛮有意思的..应该还有很多BUG跟用起来不舒服的地方吧..希望路过的朋友给提下意见.谢谢...IMYansSuggestCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->///<summary>///forTextBox///</summary>publicclassIMYansSuggest<TEntity>whereTEntity:class{#regioneventspublicdelegatevoidOnConfirmHandler阅读全文
posted @ 2011-01-05 16:22 yans 阅读(563) 评论(0) 编辑

之前做过的一个数据库操作帮助软件..设置数据的连接比较麻烦..

前两天在偶然的机会下.看到这个东西DataConnectionDialog()

很旧的了..dotNet2005的东西..旧事重提下...

 

这个类要引用的话..要直接浏览dotNet安装目录/common7/ide

有两个组件要一起引用下..

Microsoft.Data.ConnectionUI.dll

Microsoft.Data.ConnectionUI.Dialog.dll

 

使用方法如下:

 

Microsoft.Data.ConnectionUI.DataConnectionDialog dlg = new Microsoft.Data.ConnectionUI.DataConnectionDialog();
DataSource.AddStandardDataSources(dlg);

if (DataConnectionDialog.Show(dlg) == System.Windows.Forms.DialogResult.OK) {
    
//Clipboard.SetText(dlg.ConnectionString);
    MessageBox.Show(string.Format("{0}\r{1}", dlg.ConnectionString, dlg.SelectedDataProvider.DisplayName));
}

 

 

 

这个没啥好说的..直接选择数据源

选择属性

完成后通过ConnectionString属性获取连接字符串..

 

可是每次都要弹出来选择数据源,选择属性真是麻烦..有时还想默认一下的..

胡乱弄了下..主要是用到以下三条语句

 

dlg.SelectedDataSource = DataSource.SqlDataSource;
dlg.SelectedDataProvider 
= DataProvider.SqlDataProvider;
dlg.ConnectionString 
= "Data Source=.;Initial Catalog=CANDB_DATA_KJ223;Integrated Security=True";

 

第一句是设置数据源,

第二句是设置提供程序,

第三句是默认的连接字符串.

后两句代码都是依靠前一句存在的.所以..

你可以设置数据源,然后再设置一个提供程序,再设置默认连接字符串,

但..

你不可以设置完个默认连接之后,数据源跟提供程序都设置..会出错的..

 

好了..大家愉快..开心..

posted @ 2010-12-04 12:29 yans 阅读(262) 评论(0) 编辑

不知道大家网站上的缩略图是怎么"缩"的呢?

马上又要开始一个新的项目,过来这个公司养成了一个新的习惯,就是会把遇到的一些实用的程序保存下来.

我想这是一个好习惯..以前只是觉得存起来有用.现在是实际做到这一步了:"把有用的程序都保存下来"

这就是想与做的不同.

 

现在缩略图基本上有几种方式:

1.填充的方式

2.按高缩略

3.按宽缩略

4.切除方式

 

我简单地举例描述下这几种方式及它们的缺点(因为优点没啥好讲的):

1.就是把图片A按一定的宽跟高缩略,例如图片A的宽跟高是400*500,把它缩略成200*250,这样图片就是缩小了1/2,但有一个问题,假设我要把一个400*500的图片缩略成200*200的图,这样缩略下去.这个图就变形了.

2.按高跟宽缩略是指按指定的缩略高或宽缩略,例如图片A的宽跟高是400*500,我按宽缩略为200,那宽就是500*200/400=250了,如果我按高缩略为200,那高就是400*200/500=160,这样处理是没啥大问题,就是在页面上表示的时候,会出现个排列比较难处理.有处理过的朋友们应该会记得那个苦恼.

3.就是我按我要的宽跟高,例如是300*300把一张图片例如400*500把这个切300*300出来.剩下的都放弃.这样缩略会让用户上传的图,其中一部分看不到.

 

我想出一个方法,算是个折衷的方法吧,就是网页上通常都是需求固定大小的缩略图,如果我在一个资讯板块中,把无论宽跟高的所有图片都要缩略出一张200*200来当资讯图片,用第1种缩略方法有可能会把图片变形,用第二种方法没办法缩略成200*200的图片,用第三种会把图片的元素丢失.所以我觉得比较好的处理方法是这样:先画一张200*200白底的图片,再判断图片的宽跟高哪边大,假设高>宽,那就按高缩略,再把这缩略的图片以居中的方式放到那个200*200的白底图片上,完成缩略.

 

代码如下

缩略图方法
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="destLengthwidth">缩略图宽度高度</param> 
public static void MakeThumbnail( string originalImagePath, string thumbnailPath, int destLength ) {
    Image originalImage 
= Image.FromFile(originalImagePath);

    
int ow = originalImage.Width;
    
int oh = originalImage.Height;

    
if (ow > oh) {
        oh 
= oh * destLength / ow;
        ow 
= destLength;
    }
    
else {
        ow 
= ow * destLength / oh;
        oh 
= destLength;
    }

    
int x = (destLength - ow) / 2;
    
int y = (destLength - oh) / 2;

    Image bitmap 
= new System.Drawing.Bitmap(destLength, destLength);

    
//新建一个画板
    Graphics g = System.Drawing.Graphics.FromImage(bitmap);

    
//设置高质量插值法
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

    
//设置高质量,低速度呈现平滑程度
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    
//清空画布并以透明背景色填充
    g.Clear(Color.White);

    
//在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(originalImage, x, y, ow, oh);

    
try {
        
//以jpg格式保存缩略图
        bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
    }
    
catch (System.Exception e) {
        
throw e;
    }
    
finally {
        originalImage.Dispose();
        bitmap.Dispose();
        g.Dispose();
    }
}

 

 

这个方法是缩略了同样的高跟宽..如果有需求缩略成不同的宽跟高的话,只要稍微修改一下就可以用了.

posted @ 2010-03-22 10:10 yans 阅读(289) 评论(5) 编辑

今天刚刚上班的时候..隔壁同事给分配到个任务.就是做个软件.用可以分析一个关键字在搜索引擎里的搜索总量.

索性自己用Console也弄了个..

源码下载

主要用到下面几种技术:

1.插件模式

2.事件

3.委托

 

流程:

1.先实例化一个事件

2.检索插件,将找到的插件实例化并传入事件作为参数执行

3.搜索 ->  下载源码,分析,取出搜索结果总数

4.用委托回调每个结果

 

解决方案结构:

引用:

1.所有的项目都引用Yans.Implementation

2.Yans.Implementation引用System.Web

 

代码如下:

1.主程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yans.Implementation.Searcher;
using System.IO;
using System.Reflection;

namespace Yans.ConsoleApplication
{
    
class Program
    {
        
static void Main( string[] args ) { 
            StringBuilder sb 
= new StringBuilder();
            IndexEvent e 
= new IndexEvent();

            e.Actions 
= ( E, Y ) => {
                sb.AppendLine(E.GetType().Name 
+ ":" + Y);
            };

            
//获取插件并实例化到事件中
            foreach (var dllFile in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*Searcher.dll")) {

                var pluginAssembly 
= Assembly.LoadFrom(dllFile);

                
foreach (var pluginType in pluginAssembly.GetTypes()) {
                    
if (pluginType.IsPublic && !pluginType.IsAbstract && pluginType.Name.EndsWith("Searcher")) {
                        
try {
                            Activator.CreateInstance(pluginType, e);        
//创建实例并传入事件实体作为参数
                        }
                        
catch (Exception ex) {
                            Console.WriteLine(ex.Message);
                        }
                    }
                }
            }

            
//检索
            e.RaiseSampleEvent("yans"); 
            Console.WriteLine(sb.ToString()); 

            Console.Read();
        }
    }
}

 

Ps: RaiseSampleEvent是执行搜索..内容请自行修改..

 

2.调用的事件

分析结果
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;

namespace Yans.Implementation.Searcher
{

    
public class CodeAnalyzer
    { 
        
/// <summary>
        
/// 分析结果
        
/// </summary>
        
/// <param name="uri">查询地址(设定查询的参数为{0})</param>
        
/// <param name="query">查询参数</param>
        
/// <param name="pattern">过滤查询结果</param>
        
/// <param name="encoding">编码</param>
        
/// <returns>分析结果</returns>
        public static string Analyzer( string uri, string query, string pattern, string encoding ) {
            
using (var client = new WebClienter()) {
                client.Encoding 
= Encoding.GetEncoding(encoding);

                
//下载源码
                var source = client.DownLoadString(string.Format(uri, HttpUtility.UrlEncode(query, Encoding.GetEncoding(encoding))));

                
//分析结果
                Regex myRegex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
                Match myMatch 
= myRegex.Match(source);
                
if (myMatch.Success && myMatch.Groups.Count > 1) {
                    
return myMatch.Groups[1].Value;
                }
            }
            
return "[未分析到]";
        }
    }

}

 

Ps:调用下载源码并用正则的方式把要的结果过滤出来.

 

3.调用的事件

事件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Yans.Implementation.Searcher
{
    
//Searcher事件
    public class IndexEvent
    {
        
//定义委托
        public delegate void SampleEventHandler( object sender, string e );

        
//定义回调
        public Action<objectstring> Actions;

        
//定义事件
        public event SampleEventHandler SampleEvent;

        
//执行事件
        public virtual void RaiseSampleEvent( string word ) {
            
if (SampleEvent != null)
                SampleEvent(
this, word);
        }
    }
}

 

Ps:event这东西.会用的话还是很强大的.

 

4.代码下载类

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace Yans.Implementation.Searcher
{

    
public class WebClienter : IDisposable
    {
        
#region property

        
/// <summary>
        
/// 用户身份
        
/// </summary>
        public ICredentials Credential { setget; }

        Encoding encoding 
= Encoding.UTF8;
        
/// <summary>
        
/// 下载源编码
        
/// </summary>
        public Encoding Encoding {
            
set { encoding = value; }
            
get { return encoding; }
        }

        
#endregion
        
/// <summary>
        
/// 根据地址下载该网页的源代码
        
/// </summary>
        
/// <param name="UriAddress"></param>
        
/// <returns></returns>
        public string DownLoadString( Uri UriAddress ) {
            WebClient client 
= new WebClient();
            
if (null != Credential) client.Credentials = Credential;
            client.Encoding 
= Encoding;
            
return client.DownloadString(UriAddress);
        }

        
/// <summary>
        
/// 根据地址下载该网页的源代码
        
/// </summary>
        
/// <param name="UriAddress"></param>
        
/// <returns></returns>
        public string DownLoadString( string UriAddress ) {
            
return DownLoadString(new Uri(UriAddress));
        }


        
#region IDisposable 成员

        
public void Dispose() {
            Encoding 
= null;
            Credential 
= null;
        }

        
#endregion
    }
}

 

PS:以前写采集器用过的一个类..稍微对webclient做了一点点的修改..现在直接拿来用了.

 

5.插件

 

百度插件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yans.Implementation.Searcher;

namespace Yans.Searcher.BaiduSearcher
{
    
public class BaiduSearcher
    {
        
public BaiduSearcher( IndexEvent e ) {
            e.SampleEvent 
+= new IndexEvent.SampleEventHandler(e_SampleEvent);
        }

        
void e_SampleEvent( object sender, string e ) {
            
string result = CodeAnalyzer.Analyzer(@"http://www.baidu.com/s?wd={0}", e, @"相关网页约([\d,]*)篇,""gb2312");
            var searcherEvent 
= (IndexEvent)sender;
            
if (null != searcherEvent.Actions) searcherEvent.Actions(this, result);
            Console.WriteLine(
"Baidu Searched result count:" + result);
        }

    }
}

 

 

谷歌插件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yans.Implementation.Searcher;

namespace Yans.Searcher.GoogleSearcher
{
    
public class GoogleSearcher
    {
        
public GoogleSearcher( IndexEvent e ) {
            e.SampleEvent 
+= new IndexEvent.SampleEventHandler(e_SampleEvent);
        }

        
void e_SampleEvent( object sender, string e ) {
            
string result = CodeAnalyzer.Analyzer("http://www.google.cn/search?hl=zh-CN&source=hp&q={0}&aq=f&aqi=g10&aql=&oq=", e, @"获得约 <b>([\d,]*)</b> 条结果""gb2312");
            var searcherEvent 
= (IndexEvent)sender;
            
if (null != searcherEvent.Actions) searcherEvent.Actions(this, result);
            Console.WriteLine(
"Google searched result count:" + result);
        }
    }
}

 

搜搜插件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yans.Implementation.Searcher;

namespace Yans.Searcher.SosoSearcher
{
    
public class SosoSearcher
    {
        
public SosoSearcher( IndexEvent e ) {
            e.SampleEvent 
+= new IndexEvent.SampleEventHandler(e_SampleEvent);
        }

        
void e_SampleEvent( object sender, string e ) {
            
string result = CodeAnalyzer.Analyzer("http://www.soso.com/q?pid=s.idx&w={0}", e, @"搜索到约([\d,]*)项结果,用""gb2312");
            var searcherEvent 
= (IndexEvent)sender;
            
if (null != searcherEvent.Actions) searcherEvent.Actions(this, result);
            Console.WriteLine(
"Soso searched result count:" + result);
        }
    }
}

 

Ps:这三个插件都是作为一个独立的项目存在的,如果需要添加新的插件..可以再添加一个项目..生成为dll文件后,放到程序的目录里.就可以直接使用了..

 

总结:

1.插件模式的原理..我的理解就是让程序去搜索可用的插件,并将其在需要使用的时候实例化..

2.此文也算是扔个砖头引块玉来..  - - 那成语怎么说来着?

3.本程序在VS2010下调用通过..VS2008或VS2005可能会做点修改..

posted @ 2010-03-16 17:14 yans 阅读(191) 评论(0) 编辑

赶在下班之前,发个简单的.net邮件发送组件

 

1.先添加引入命名空间 System.Net.Mail

 

2.组件代码:

/// <summary>
/// 邮件发送组件 
/// </summary>
public class EmailUtils
{
    
static EmailUtils() {
        MailHost 
= ConfigurationManager.AppSettings["mailHost"];
        MailUserName 
= ConfigurationManager.AppSettings["mailUserName"];
        MailPsw 
= ConfigurationManager.AppSettings["mailPsw"];
        MailFrom 
= ConfigurationManager.AppSettings["mailFrom"];
    }
    
public static string MailFrom {
        
get;
        
set;
    }
    
public static string MailHost {
        
get;
        
set;
    }
    
public static string MailUserName {
        
get;
        
set;
    }
    
public static string MailPsw {
        
get;
        
set;
    }
    
/// <summary>
    
/// 发送邮件 
    
/// </summary>
    
/// <param name="mailto">发送到</param>
    
/// <param name="title">标题</param>
    
/// <param name="msg"></param>
    
/// <returns></returns>
    public static bool Send(string mailto, string title, string msg) {
        var client 
= new SmtpClient();
        client.Host 
= MailHost;
        client.UseDefaultCredentials 
= false;
        client.Credentials 
= new System.Net.NetworkCredential(MailUserName, MailPsw);
        client.DeliveryMethod 
= SmtpDeliveryMethod.Network;
        System.Net.Mail.MailMessage message 
= new MailMessage(MailFrom, mailto);
        message.Subject 
= title;
        message.Body 
= msg;
        message.BodyEncoding 
= System.Text.Encoding.UTF8;
        message.IsBodyHtml 
= true;
        
try {
            client.Send(message);
            
return true;
        }
        
catch {
            
return false;
        }
    }


}

 

 

使用时直接调用 Send 方法即可.

 

完毕.

posted @ 2010-03-11 18:00 yans 阅读(121) 评论(0) 编辑
摘要: ContentTypeCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->".*"="application/octet-stream"".001"="application/x-001"".301"="application/x-301"".323"="...阅读全文
posted @ 2010-03-10 17:51 yans 阅读(78) 评论(0) 编辑
摘要: 记得以前做过的电子商务项目里,产品图片是要经过服务器端去控制获取的,那时使用的是Http Handler.实现的方法大致如下:实现接口[代码]web.config配置代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?xmlversion=...阅读全文
posted @ 2010-03-10 17:42 yans 阅读(441) 评论(0) 编辑
摘要: 前几天做一个关于数据表优化的程序,由于数据库里面的字段的关系非常复杂,操作起来比较麻烦,刚用的时候还好,运行时间一长,生成的事务日志很大,占用了10几G,磁盘都快用完了。 到网上搜了一下,方法下面两种: 1.分离数据库,直接删除事务日志文件,再附加数据库,系统会为数据库创建一个新的日志文件 2.清除事务日志并收缩数据库 第一种方法我没用过,也不建议用,原因有两个:分离数据库会造成连接数据库的系统停...阅读全文
posted @ 2008-12-10 17:00 yans 阅读(1378) 评论(0) 编辑
摘要: http://www.taobao.com/theme/tao_source/#prev淘定开放平台淘宝开放平台将为软件商提供淘宝网C2C电子商务平台的API接口(应用程序可编程接口)、开发环境以及商务应用环境。 我们可以利用那些API来开发属于自己的系统应用于阿里和淘宝,同时我们的作品也可以在该平台上进行销售,赚取利润...费话不多说.软件的申请流程在网页上讲得比较清楚.有兴趣的朋友请上去自己看...阅读全文
posted @ 2008-09-29 16:25 yans 阅读(1260) 评论(4) 编辑