FAQ:操纵下拉列表

——谨以怀念写邮件回答网友关于Internet Explorer编程问题的青春岁月

Posted by eagleboost on October 15, 2004

本文转载自我2004年在csdn发布的博客

张老师,您好!

看了您的老文章TWebBrowser编程简述,觉得非常有帮助。 我现在碰到了一个难题, 请问怎么样编程控制一个联动的下拉列表呢?例如省、县联动的select,从外边用程序控制自动输入某些值,

期待您的帮助,

2004-10-14

1) 设置IHTMLSelectElement接口的selectedIndex属性可以改变选中的列表项。 2) 动态添加列表项。

先调用IHTMLDocument2::createElement创建一个option对象,

1
2
3
4
HRESULT createElement(
  BSTR eTag,     //标签名,可以是img, area, option(ie4), frame, iframe(ie5)
  IHTMLElement **newElem   //返回对象指针  
);

再调用IHTMLSelectElement::add将创建的option对象添加到列表中

1
2
3
4
HRESULT add(
  IHTMLElement *element,
  VARIANT before   //添加到哪个位置,VT_I4类型的VARIANT
);

更详细的内容参阅MSDN

3) 要操纵列表中每个项,先从IHTMLSelectElementitem属性得到列表项的集合,再通过IHTMLOptionElement接口来操纵。下面的例子演示了如何将下拉列表每一项的文字添加到一个BSTR数组pszOptText中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
HRESULT GetOptions(IHTMLSelectElement *ppvSelect, BSTR *pszOptText, long *plItems)
{    
  IDispatch *ppvdispOption;    
  IHTMLOptionElement *ppvOption;    
  HRESULT hResult;
  
  // 取得select对象中optoin对象的数目    
  ppvSelect->get_length(plItems);     
  for (long i=0;i<*plItems;i++)
  {
    // 获取IDispatch指针 
    _variant_t index = i; 
    hResult = ppvSelect->item( index, index, &ppvdispOption ); 
    if FAILED(hResult) 
    {
      return(hResult);
    }

    // 得到IHTMLOptionElement接口. 
    hResult = ppvdispOption->QueryInterface( IID_IHTMLOptionElement, (void **) &ppvOption); 

    ppvdispOption->Release(); 

    if FAILED(hResult) 
    {
      return(hResult);
    }

    // 把文字添加到BSTR数组. 
    hResult = ppvOption->get_text(&(pszOptText[i])); 
    ppvOption->Release(); 
    if FAILED(hResult) 
    {
      return(hResult);
    }
  }    
  return S_OK;
}