显示列表

可以通过引入 mshtml 中的一些类可以实现操作页面中的元素。
项目引用“C:\WINDOWS\system32\mshtml.tlb”。

mshtml.IHTMLDocument2 iHTMLDocument2 = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument;
mshtml.IHTMLWindow2 iHTMLWindow2 = (mshtml.IHTMLWindow2)iHTMLDocument2.parentWindow;

// 根据 name 查找页面中的元素。根据类型不同,转成相应的类型。
// 找页面中的 Frame 元素。
mshtml.IHTMLFrameBase2 iFrame = (mshtml.IHTMLFrameBase2)iHTMLDocument2.all.item("FrameName", 0);
mshtml.IHTMLDocument2 iHTMLDocument2 = iFrame.contentWindow.document;



// 找页面中的 Input 元素。
mshtml.IHTMLInputElement input = (mshtml.IHTMLInputElement)iHTMLDocument2.all.item("InputName", 0);

// 找页面中的 Img 元素。
mshtml.IHTMLImgElement img1 = (mshtml.IHTMLImgElement)iHTMLDocument2.all.item("img1", 0);
操作如:img1.src、img1.alt、img1.height + img1.align

mshtml名字空间里对 Html 的每一个元素都有对应的一个类。这个类就可以设置或读取元素的属性。
HTMLDivElement、HTMLSpanElement、HTMLAnchorElement 等等。

// 实现单击按钮
mshtml.IHTMLElement iHTMLElement = (mshtml.IHTMLElement)iHTMLDocument2.all.item(name, 0);
iHTMLElement.click();// 单击

标签:WebBrowser 
查看全文 | 分类(C#/CSharp) | 访问(73) | 编辑

经常在基类的构造函数中获取用户的信息,比如Cookie、Session等,但Session在构造时却还不存在。
不过在OnInit时就可读取Session值了。
public partial class BasePage : System.Web.UI.Page
{
    public BasePage()
    {
        // 这里Session对象还未创建
        if (System.Web.HttpContext.Current.Session == null)
        {
            System.Web.HttpContext.Current.Response.Write("Session Is Null");
        }
        else
        {
            System.Web.HttpContext.Current.Response.Write("Session Is Exist");
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        // 这里就可以访问Session对象了
        if (System.Web.HttpContext.Current.Session == null)
        {
            System.Web.HttpContext.Current.Response.Write("Session Is Null");
        }
        else
        {
            System.Web.HttpContext.Current.Response.Write("Session Is Exist");
        }
    }
}

标签:Session 
查看全文 | 分类(Asp.Net) | 访问(49) | 编辑

<SCRIPT LANGUAGE="JavaScript">
<!--
// Unicode 中汉字编码范围:4E00 - 9FA5
var startNum = HexToInt('4E00'); // 开始
var endNum = HexToInt('9FA5'); // 结束

var text = '';
var cols = 16; // 一行十六个
for (var i = startNum; i < endNum + 1; i++)
{
    if (cols == 0)
    {
        cols = 16;
        text += '<br/>';
    }

    text += String.fromCharCode(i);

    cols--;
}
document.write('<div style="font-size: 50px;">');
document.write(text);
document.write('</div>');

// 十六进制转十进制
function HexToInt(s)
{
    return parseInt(s,16);
}

// 十进制转十六进制
function IntToHex(s)
{
    return s.toString(16);
}
//-->
</SCRIPT>

查看全文 | 分类(JavaScript) | 访问(175) | 编辑

PR是英文Pagerank 的缩写形式,Pagerank取自Google的创始人LarryPage,它是Google排名运算法则(排名公式)的一部分,Pagerank是Google对网页重要性的评估,是Google用来衡量一个网站的好坏的唯一标准。PR值的级别从1到10级,10级为满分。PR值越高说明该网页越受欢迎。那么PR值都受那些因素影响呢?

一、提高网站外部链接的质量和数量
在计算网站排名时,Pagerank会将网站的外部链接数考虑进去。
PR分值的计算公式: PR(A)=(1-D) + D*(PR(t1)/C(t1))
D表示阻尼因数一般是0.85。
PR(t1)表示网站的PR值
C(t1)表示网站对外的链接数
假设一个PR值为4的网站,对外的链接数为10个,则计算公式如下:  
PR(A) = (1-D) + D*(PR(t1)/C(t1))
PR(A) = (1-0.85) + 0.85*(4/10)
PR(A) = 0.15 + 0.85*0.4
PR(A) = 0.15 + 0.34
PR(A) = 0.49
这样每一个链接的网站就得到了0.49的PR分值了。如果一个网站外部链接的页面PR值是零,那么就可以得0.15的PR值,要是这个页面没被Google收入或没有RP值那就不计算了。最好是找那些PR值高且外部链接数又少的网站,如果没有那就积少成多,多增加网站外部链接。

注意:如果这个网站没有被Google收入,可能是作弊被K了,最好不要和它做连接。一般建站很久了,没被收入的多是被K过了。


二、被知名网络目录收录
Google的Pagerank系统对有些门户网络目录如DMOZ,Yahoo和Looksmart尤为器重。被这些目录收入后,PR值会立即得到提升,但要被这些目录收入是很难的,当然有钱什么都好办。对大多数人来说这方法不实用。

总结:最实用的方法是增加网站外部链接的质量和数量

标签:PR值 
查看全文 | 分类(网站运营) | 访问(41) | 编辑

用Webbrowser控件加载网页时,通常会用DocumentCompleted事件来指示网页加载完毕。但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕。要通过WebBrowserNavigatedEventArgs来判断。



private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url != webBrowser1.Document.Url) return;
 
    // 当 e.Url == webBrowser1.Document.Url 我们要的网页加载完毕
    // 加载完毕
    // ...
}

标签:Webbrowser 
查看全文 | 分类(C#/CSharp) | 访问(164) | 编辑
 DataTable排序2008-05-22

DataTable dt = dataTable.Clone();
dt.Rows.Clear();

DataRow[] rows = dataTable.Select(String.Empty, "ArticleID Desc");
foreach (DataRow row in rows)
{
    dt.ImportRow(row); //数据导入新的DataTable中
}

查看全文 | 分类(C#/CSharp) | 访问(360) | 编辑

网站会员登陆机制

1.登录后,把用户信息写入在线用户表,并把 Username 和 Password 写入用户的 Cookie 中
2.访问页面时,读取 Cookie 中的 Username、Password,查询在线用户表,判断是否登录过
3.定时清理在线用户表中过期的用户

这样每次登陆用户访问页面时,只要查询在线用户表,不需要查询数据库中的用户表。
在线用户表是缓存表,不是一个数据表

C# 实现
InfoUser 类存放用户的信息
ArrayList 类中存放 InfoUser 类
当用户登录后,把用户的 InfoUser 类加入 ArrayList 类中,ArrayList 类是一个静态类
每次读取 Cookie 中的 Username、Password,再遍历 ArrayList 中的 InfoUser,如果配上,表示是登录用户。

查看全文 | 分类(网站编程) | 访问(2) | 编辑

在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。
解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。
新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现。

用 BackgroundWorker 类执行耗时的操作
BackgroundWorker 类在 System.ComponentModel 命名空间下。
VS 的工具箱时有一个 BackgroundWorker 组件,就是这个类。


常用方法

1.RunWorkerAsync
开始执行后台操作。引发 DoWork 事件

2.CancelAsync
请求取消挂起的后台操作。
注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查 CancellationPending 属性,来决定是否要继续执行耗时的操作。

3.ReportProgress
引发 ProgressChanged 事件。


常用属性

1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。


常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。

2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生。

3.ProgressChanged
调用 ReportProgress 方法时发生。



例子

private BackgroundWorker backgroundWorker = new BackgroundWorker();

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.WorkerSupportsCancellation = true;

    // 绑定执行的后台操作
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
    
    // 绑定后台操作完成后执行的方法
    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
    
    // 控制进度的方法
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

    // 引发 DoWork 事件,这时就是在线程中执行 backgroundWorker_DoWork 方法
    backgroundWorker.RunWorkerAsync();

    button1.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
    backgroundWorker.CancelAsync(); // 请求取消挂起的后台操作
}

// 这里不可以访问用户界面上的控件
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    System.Threading.Thread.Sleep(5000);

    // 报告进度,引发 ProgressChanged 事件
    backgroundWorker.ReportProgress(50); // 这里完成了50%

    if (!backgroundWorker.CancellationPending) // 判断用户是否执行了 CancelAsync 方法
    {
        System.Threading.Thread.Sleep(5000);
    }
    else
    {
        MessageBox.Show("中止了。");
    }
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // 这里可以访问用户界面上的控件
    button1.Enabled = true;
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // 一般通过 ProgressBar 类来显示进度
    MessageBox.Show(e.ProgressPercentage.ToString());

    // e.ProgressPercentage、e.UserState
}



在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
如果想在 DoWork 事件处理程序中和用户界面的控件通信,可在用 ReportProgress 方法。
ReportProgress(int percentProgress, object userState),可以传递一个对象。
ProgressChanged 事件可以从参数 ProgressChangedEventArgs 类的 UserState 属性得到这个信息对象。

简单的程序用 BackgroundWorker 比 Thread 方便,Thread 中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或 BeginInvoke 方法,没有 BackgroundWorker 方便。

查看全文 | 分类(C#/CSharp) | 访问(97) | 编辑

如有多个网站,它们页面的编码不一样,有些是 UTF-8 编码,有些是 GB2312 编码。
要发评论到一个共同的页面,这时如果双方的编码不一样,那么中文字就成乱码了。
可以先把数据转成URL编码格式,再发送。还要指定编码,这样接收时才能对应解码。

URL编码格式,如“汉”字:
GB2312编码:BABA URL格式:%BA%BA
UTF-8 编码:E6B189 URL格式:%E6%B1%89
就是在每个字节编码前加个百分号。数字、字母不变,空格用加号代替。


页面是GB2312编码,发表代码:

1) 传送UTF-8编码
<script language="JavaScript">
function OnSubmit()
{
    var obj = document.getElementById('Content');
    var obj2 = document.getElementById('Content2');

    obj.value = encodeURI(obj2.value); // 返回 UTF-8 编码 URI 的字符串

    return true;
}
</script>

<form method="post" action="http://www.utf8.com/post_save.aspx" onsubmit="return OnSubmit();">
<textarea name="Content2" rows="10" cols="60"></textarea>
<textarea name="Content" rows="10" cols="60" style="display:none"></textarea>
<input type="hidden" name="Charset" value="UTF-8">
<input type="submit" value="提交" />
</form>




2) 传送GB2312编码
<script language="JavaScript">
function OnSubmit()
{
    var obj = document.getElementById('Content');
    var obj2 = document.getElementById('Content2');

    obj.value = UrlEncode(obj2.value);

    return true;
}

function UrlEncode(str)
{
    var r = '';
    var strSpecial = '!"#$%&\'()*+,/:;<=>?[]^`{|}~%';

    for(var i = 0; i < str.length; i++)
    {
        var chr = str.charAt(i);
        var cHex = GetHexGB2312(chr); // 返回字符的 GB2312 编码的十六进制值。JavaScript 可以获取字符的 Unicode 编码;VBScript 可以获取字符的 GB2312 编码。
        
        // 开始转成编码的URL格式
        if(parseInt('0x' + cHex) > 0x7f) // 大于 126
        {
            r += '%' + cHex.slice(0, 2) + '%' + cHex.slice(-2);
        }
        else // ASCII 中的字符,如字母、数字、符号等。
        {
            if(chr == ' ')
                r += '+';
            else if(strSpecial.indexOf(chr) != -1)
                r += '%' + cHex;
            else
                r += chr;
        }
    }

    return r;
}
</script>
<script language="VBScript">
<!--
Function GetHexGB2312(s)
    GetHexGB2312 = hex(asc(s))
End Function
//-->
</script>
<form method="post" action="http://www.utf8.com/post_save.aspx" onsubmit="return OnSubmit();">
<textarea name="Content2" rows="10" cols="60"></textarea>
<textarea name="Content" rows="10" cols="60" style="display:none"></textarea>
<input type="hidden" name="Charset" value="GB2312">
<input type="submit" value="提交" />
</form>

接收页面是UTF-8编码,C#代码:

<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<script language="C#" runat="server">
private System.Text.Encoding encodingUTF8 = System.Text.Encoding.GetEncoding("UTF-8");
private System.Text.Encoding encodingGB2312 = System.Text.Encoding.GetEncoding("GB2312");

public void Page_Load(object sender, System.EventArgs e)
{
    string content = Request.Form["Content"].ToString();
    string charset = Request.Form["Charset"].ToString(); // 内容的编码

    if (charset == "GB2312")
    {
        content = System.Web.HttpUtility.UrlDecode(content, encodingGB2312);
    }
    else
    {
        content = System.Web.HttpUtility.UrlDecode(content, encodingUTF8);
    }

    Response.Write(content);
}
</script>

标签:网页编码 
查看全文 | 分类(网站编程) | 访问(34) | 编辑

用C#写的WinForms程序,在自已机器上能正常运行,在其他机器上不能运行,提示“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

网上搜索在其他机器上不能运行原因主要有两个:
1.没有装.Net Framework
2.缺少关联的程序集

如果没有装.Net Framework错误提示不会这样。原因应该是缺少关联的程序集。

找到错误的地方,程序引用了C:\Windows\System32\mshtml.tlb,当使用 mshtml 空间中的对象时就提示“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

解决的方法
通过类型库导入程序(Tlbimp.exe)将 COM 类型库中的类型定义转换为公共语言运行库程序集中。
在 Visual Studio 命令提示中执行
tlbimp C:\Windows\System32\mshtml.tlb /out:C:\mshtml.dll
转换需要一定时间,生成的 mshtml.dll 有8M。
在WinForms程序中添加引用这个 mshtml.dll,不要引用 C:\Windows\System32\mshtml.tlb
最后把这个mshtml.dll和exe文件复制过去就可以用了。


标签:错误 
查看全文 | 分类(C#/CSharp) | 访问(25) | 编辑