感谢蒋晟的系列文章,让我学到了很多关于浏览器编程的技术。现在我已经在网页里定义好了表格 <table id="tableid"></table> 只要往里面插入数据就行了,用put_innerHTML的方法是可以的,感觉不“专业”啊,呵呵!现在我知道怎样获取网页元素的IHTMLElement接口,但它只能操作其 innerHTML 之类的字符串,但不能创建表行表列;IHTMLTable接口又只能创建、删除表行表列,不能设置其内容;这两个接口可以通过QuerryInterface()相互获取吗?
对于这个问题谁能给小弟指条明路吗?非常感谢!
对于这个问题谁能给小弟指条明路吗?非常感谢!
解决方案 »
- CAsyncSocket通信编译器默认unicode码,使用Connect函数连接是否连接不上(Connect函数参数是int类型的)
- vc 图片随鼠标移动而移动
- 资源文件释放问题
- 关于CDC绘图的问题请高手指点
- activeX 如何响应oncreate消息?? 100分
- Windows下的程序中用Ftp访问Unix下Ftp服务器上的文件,出现未知错误
- 编译的问题
- 请教一下关于list control网格显示不刷新的问题
- StretchDIBits显示图像问题
- 请问如何安装Microsoft Visual Studio.net(六张装)?
- VS2005,MFC的view类中怎么删除一个函数?
- 能否推荐几个有用的软件工程师培训班
1、通过tmp=document.createElement("div")创建一个临时元素;
2、在这个div元素中添加表格元素的HTML串:tmp.innerHTML = "<table>" + rows + "</table>";
3、通过ID或者其它导航方式获得目标table元素tab(例如tab=document.getElementById("tableid");)
4、通过循环方式来添加tab的行列数据:
while(tmp.childNodes[0].tBodies[0].rows.length>0)
tab.tBodies[0].appendChild(tmp.childNodes[0].tBodies[0].rows[0]);为了方便表达,上面的代码用的js语法,请自行翻译成C++语法。
我已经通过IHTMLElementCollection::item()方法获得了该Table的IDispatch接口,现在只是将这个IDispatch接口强制类型转换转成IHTMLTable,不知道这样是否可行?如果可以的话,那么在我得到了一个TD的IHTMLTableCell接口之后如何设置它的值呢?因为IHTMLTableCell接口并没有提供象innerHTML的方法,这肯定是我理解上的不足,所以还望高人指点,帮我澄清一下,谢谢!
{
CComPtr<IHTMLElement> pElem = NULL;
CComPtr<IHTMLTableRow> pRow = NULL;
CComPtr<IHTMLTableCell> pCell = NULL; if( !m_pTable ) return; //m_pTable就是这个表的IHTMLTable接口 m_pTable->insertRow( 0, (IDispatch**)&pRow ); //在表头插入 for( int i=0; i<num; i++)
{
pRow->insertCell( -1, (IDispatch**)&pCell );
pElem = pCell;
pElem->put_innerText( strCols[i].AllocSysString() );
pCell.Release();
pElem.Release();
} pElem = pRow;
pElem->put_className( className.AllocSysString() );
pElem.Release();
pRow.Release();
}
可惜上面的代码运行起来很不稳定,经常“跑飞”(有时候在insertRow,有时候在insertCell),以至程序挂了,谁能解释一下吗?
真的非常感谢!
http://www.codeproject.com/KB/cpp/whotfixcheck.aspx
CComPtr<IDispatch> spDisp;
m_pTable->insertRow(0, &spDisp);
CComQIPtr<IHTMLTableRow> pRow = spDisp;
或者
CComPtr<IHTMLTableRow> pRow;
spDisp.QueryInterface(&pRow);其余代码也类似。
而且我发现这个方法效率还挺好,对于数据量很大的表格,由于“事件队列”的缓冲使得界面不至于假死。