как создать <tr>строку и добавить / вставить ее в таблицу во время выполнения на веб-странице + MSHTML - PullRequest
1 голос
/ 05 мая 2010

Я использую IHTMLdocument2 для создания элемента

Это мой код:

IHTMLdocument2  pDoc2;//it is initialized in ma code
BSTR eTag = SysAllocString(L"TR");
    IHTMLElement *pTRElmt = NULL;
    hr = pDoc2->createElement(eTag,&pTRElmt);
    if(FAILED(hr))
    return hr;

    IHTMLDOMNode *pTRNode = NULL;
    hr = pTRElmt->QueryInterface(IID_IHTMLDOMNode, (void **)&pTRNode);
    if(FAILED(hr))
    return hr;

    // create TD node
    IHTMLElement *pTDElmt = NULL;
    hr = pDoc2->createElement(L"TD",&pTDElmt);
    if(FAILED(hr))
    return hr;

    IHTMLDOMNode *pTDNode = NULL;
    hr = pTDElmt->QueryInterface(IID_IHTMLDOMNode,(void **)&pTDNode);
    if(FAILED(hr))
    return hr;

    IHTMLDOMNode *pRefNode = NULL;
    hr = pTRNode->appendChild(pTDNode,&pRefNode);
    if(FAILED(hr))
    return hr;

    // create TEXT Node
    IHTMLDOMNode *pTextNode = NULL;
    hr  = pDoc3->createTextNode(L"madhu", &pTextNode);
    if(FAILED(hr))
    return hr;

    IHTMLDOMNode *pRefNod = NULL;
    hr = pTDNode->appendChild(pTextNode,&pRefNod);
    if(FAILED(hr))
    return hr;


    //********* setting attributes for <tr>
    /*
    VARIANT bgclor;
    bgclor.vt = VT_I4;
    bgclor.lVal =0xC0C0C0;
    hr = newElem->setAttribute(L"bgcolor",bgclor,1);
    if(FAILED(hr))
    return hr;

    VARIANT style;
    style.vt = VT_BSTR;
    style.bstrVal = SysAllocString(L"display: table-row");
    hr = newElem->setAttribute(L"style",style,1);
    if(FAILED(hr))
    return hr;

    VARIANT id;
    id.vt = VT_BSTR;
    id.bstrVal = SysAllocString(L"AttrRowMiddleName");
    hr = newElem->setAttribute(L"id",id,1);
    if(FAILED(hr))
    return hr;
    */

    //create <td> for row <tr>


    /*
    VARIANT Name;
    Name.vt = VT_BSTR;
    Name.bstrVal = SysAllocString(L"MiddleName");
    hr = newElem->setAttribute(L"name",Name,1);
    if(FAILED(hr))
    return hr;

    VARIANT Type;
    Type.vt = VT_BSTR;
    Type.bstrVal = SysAllocString(L"text");
    hr = newElem->setAttribute(L"type",Type,1);
    if(FAILED(hr))
    return hr;

    VARIANT Value;
    Value.vt = VT_BSTR;
    Value.bstrVal = SysAllocString(L"button");
    hr = newElem->setAttribute(L"value",Value,1);
    if(FAILED(hr))
    return hr;
    */



    //IHTMLDOMNode *pReturn = NULL;
    //hr = pParentNode->replaceChild(pdn,pFirstchild,&pReturn);
    //if(FAILED(hr))
    // return hr;

    VARIANT refNode;
    refNode.vt = VT_DISPATCH;
    refNode.pdispVal = pDomNode;

    IHTMLDOMNode *pREfTochild = NULL;
    hr = pParentNode->insertBefore(pTRNode,refNode,&pREfTochild);
    if(FAILED(hr))
return hr;

Это вставка чего-то, но не видимого, и вставка как и когда появляется тег tr

Я даже пытался с клоном, но та же проблема.

Просьба кто-нибудь дать правильный код для этого

1 Ответ

2 голосов
/ 15 марта 2011

Не уверен, что это все еще необходимо, но вот как я решил проблему. Если вы посмотрите на примеры кода, между моим фрагментом кода и кодом Madhu ничего не изменилось.

Хитрость была в том, как передать строку "TR". Я не мог понять, почему это имеет значение, но это так. Возможно, кто-то еще может пролить свет на то, почему.

Это не сработало:

BSTR eTag = SysAllocString(L"TR");
hr = pDoc2->createElement(eTag,&pTRElmt);

Это сделал:

hr = pDoc2->createElement(L"TR",&pTRElmt);

Вот фрагмент кода, который работал для меня:

// create table node
IHTMLElement *pTableElmt = NULL;
hr = pDoc2->createElement(L"TABLE",&pTableElmt);
if(FAILED(hr))
return hr;

IHTMLDOMNode *pTableNode = NULL;
hr = pTableElmt->QueryInterface(IID_IHTMLDOMNode, (void **)&pTableNode);
if(FAILED(hr))
return hr;

// create TR node
BSTR eTag = SysAllocString(L"TR");
IHTMLElement *pTRElmt = NULL;
hr = pDoc2->createElement(L"TR",&pTRElmt);
if(FAILED(hr))
return hr;

IHTMLDOMNode *pTRNode = NULL;
hr = pTRElmt->QueryInterface(IID_IHTMLDOMNode, (void **)&pTRNode);
if(FAILED(hr))
return hr;

IHTMLDOMNode *pRefNode = NULL;
hr = pTableNode->appendChild(pTRNode,&pRefNode);
if(FAILED(hr))
return hr;

// create TD node
IHTMLElement *pTDElmt = NULL;
hr = pDoc2->createElement(L"TD",&pTDElmt);
if(FAILED(hr))
return hr;

IHTMLDOMNode *pTDNode = NULL;
hr = pTDElmt->QueryInterface(IID_IHTMLDOMNode,(void **)&pTDNode);
if(FAILED(hr))
return hr;

hr = pTRNode->appendChild(pTDNode,&pRefNode);
if(FAILED(hr))
return hr;

// create TEXT Node
IHTMLDOMNode *pTextNode = NULL;
hr  = pDoc3->createTextNode(L"madhu", &pTextNode);
if(FAILED(hr))
return hr;

hr = pTDNode->appendChild(pTextNode,&pRefNode);
if(FAILED(hr))
return hr;

//add to body
CComQIPtr<IHTMLElement> pBody;
CComQIPtr<IHTMLDOMNode> pBodyNode;
pDoc2->get_body( &pBody );
pBody->QueryInterface(IID_IHTMLDOMNode, (void**)&pBodyNode);    
HRESULT hr = pBodyNode->appendChild( pTableNode, &pRefNode);
...