C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ComboBoxのUIAutomation


(過去ログ 83 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■49011 / inTopicNo.1)  ComboBoxのUIAutomation
  
□投稿者/ クロスポ (1回)-(2010/04/20(Tue) 13:38:32)

分類:[.NET 全般] 

いつもありがたく活用させていただいています。

UIAutomationで質問があります。
開発環境は、VS2008 C# .NET3.5SP1です。

以下のようにTextBoxに動的に値を設定することはできました。

AutomationElement vpTxtText = FindElement(aeForm, "txtText");
ValuePattern ipTxtText = (ValuePattern)vpTxtText.GetCurrentPattern(ValuePattern.Pattern);
ipTxtText.SetValue("test");

ComboBoxも同様に値を設定したいのですが、方法がわかりません。
以下のように設定値を取得することはできました。

AutomationElement vpCmbGame = FindElement(aeForm, "cmb");
AutomationElementCollection aecListItems = vpCmb.FindAll(
TreeScope.Children,new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.ListItem));
Console.WriteLine(vpCmb[1].Current.Name);

よろしくお願いします。
引用返信 編集キー/
■49032 / inTopicNo.2)  Re[1]: ComboBoxのUIAutomation
□投稿者/ Hongliang (607回)-(2010/04/20(Tue) 18:50:05)
「値の設定」というのは、直接入力可能な ComboBox に対して文字列を設定する、ということでしょうか。それとも、ドロップダウンリスト内から特定の項目を選択する、ということでしょうか。
前者であれば ComboBox を指す ControlType.ComboBox の AutomationElement から ValuePattern を取得して SetValue すればいいです。
後者なら、その特定の項目を指す ControlType.ListItem の AutomationElement から SelectionItemPattern を取得して Select すればいいです。

なお、当然ながら、直接入力が不可能な(ドロップダウンリストから選択するだけの)コンボボックスに文字列を設定することはできません。
引用返信 編集キー/
■49066 / inTopicNo.3)  Re[2]: ComboBoxのUIAutomation
□投稿者/ クロスポ (2回)-(2010/04/21(Wed) 12:02:00)
No49032 (Hongliang さん) に返信

返信ありがとうございます。
後者のケースです。

> 後者なら、その特定の項目を指す ControlType.ListItem の AutomationElement から SelectionItemPattern を取得して Select すればいいです。

以下のコードで何度も試してみましたが、やはりうまくいきません。
ご指摘いただけるとありがたいです。
よろしくお願いします。

AutomationElement vpCmbTest = FindElement(aeForm, "cmbTest");
SelectionPattern ipCmbTest = (SelectionPattern)vpCmbTest.GetCurrentPattern(SelectionPattern.Pattern);

AutomationElementCollection aecListItems = vpCmbTest.FindAll(TreeScope.Children,new PropertyCondition(
AutomationElement.ControlTypeProperty,ControlType.ListItem));

AutomationElement itemToSelect = aecListItems[aecListItems.Count - 1];
SelectionItemPattern ipCmbGame = (SelectionItemPattern)itemToSelect.GetCurrentPattern(SelectionItemPattern.Pattern);
ipCmbGame.Select();

引用返信 編集キー/
■49070 / inTopicNo.4)  Re[3]: ComboBoxのUIAutomation
□投稿者/ Hongliang (612回)-(2010/04/21(Wed) 13:13:36)
「うまくいきません」で止まらず、せめてどこで失敗しているかぐらいは確認しましょうよ。
どの呼び出しが失敗したのかが分かれば、何故失敗したのか考えることもできるようになります。

ComboBox はエディットコントロールとリストコントロールを組み合わせたコントロールです。
ですので、ComboBox が直接リストの各要素を持ってるわけではない可能性が考えられます。

以下はある AutomationElement の子にどんな種類の要素があるのか確認するメソッドです。
vpCmbTest に値が入ったところでブレイクして、イミディエイトウィンドウで
CheckAutomationChildren(vbCmbTest)
などして、どんな子要素が AutomationElement に含まれているか確認してみて下さい。

static void CheckAutomationChildren(AutomationElement element) {
  foreach (System.Reflection.FieldInfo field in typeof(ControlType).GetFields()) {
    try {
      ControlType type = (ControlType)field.GetValue(null);
      AutomationElementCollection children = element.FindAll(TreeScope.Children,
        new PropertyCondition(AutomationElement.ControlTypeProperty, type));
      if (children.Count > 0)
        Debug.Print("{0} 個の {1}", children.Count, field.Name);
    } catch { }
  }
}

引用返信 編集キー/
■49072 / inTopicNo.5)  Re[4]: ComboBoxのUIAutomation
□投稿者/ クロスポ (3回)-(2010/04/21(Wed) 13:59:46)
返信ありがとうございます。

children.Count
field.Name
ともに正しく取得できました。

WPFのコンボボックスだからでしょうか。

SelectionItemPattern ipCmb = (SelectionItemPattern)itemToSelect.GetCurrentPattern(SelectionItemPattern.Pattern);
ipCmb.Select(); ← この行で怒られます。

No49070 (Hongliang さん) に返信
> 「うまくいきません」で止まらず、せめてどこで失敗しているかぐらいは確認しましょうよ。
> どの呼び出しが失敗したのかが分かれば、何故失敗したのか考えることもできるようになります。
>
> ComboBox はエディットコントロールとリストコントロールを組み合わせたコントロールです。
> ですので、ComboBox が直接リストの各要素を持ってるわけではない可能性が考えられます。
>
> 以下はある AutomationElement の子にどんな種類の要素があるのか確認するメソッドです。
> vpCmbTest に値が入ったところでブレイクして、イミディエイトウィンドウで
> CheckAutomationChildren(vbCmbTest)
> などして、どんな子要素が AutomationElement に含まれているか確認してみて下さい。
>
> static void CheckAutomationChildren(AutomationElement element) {
> foreach (System.Reflection.FieldInfo field in typeof(ControlType).GetFields()) {
> try {
> ControlType type = (ControlType)field.GetValue(null);
> AutomationElementCollection children = element.FindAll(TreeScope.Children,
> new PropertyCondition(AutomationElement.ControlTypeProperty, type));
> if (children.Count > 0)
> Debug.Print("{0} 個の {1}", children.Count, field.Name);
> } catch { }
> }
> }
引用返信 編集キー/
■49075 / inTopicNo.6)  Re[5]: ComboBoxのUIAutomation
□投稿者/ Hongliang (613回)-(2010/04/21(Wed) 15:26:27)
それなら、そのとき ListItem を指してる AutomationElement の Current の情報を確認してみて下さい。
で、Automation.AddAutomationPropertyChangedEventHandler を使って問題のプロパティが変更されるタイミングを報告するようにし、適当に UI を操作してどういうときに有効になるか確認する…というのが基本的な作業でしょうかね。

目的の ListItem が無効の場合、一旦 ComboBox を ExpandCollapsePattern で Expand&Collapse してやれば全ての ListItem が有効になると思います。
引用返信 編集キー/
■49076 / inTopicNo.7)  Re[6]: ComboBoxのUIAutomation
□投稿者/ クロスポ (5回)-(2010/04/21(Wed) 15:39:27)
できました^0^/
ありがとうございます。

SelectionItemPatternを行う前に以下のコードを記載したらできました。
助かりました。

ExpandCollapsePattern expandPattern = (ExpandCollapsePattern)vpCmb.GetCurrentPattern(ExpandCollapsePattern.Pattern);
expandPattern.Expand();


No49075 (Hongliang さん) に返信
> それなら、そのとき ListItem を指してる AutomationElement の Current の情報を確認してみて下さい。
> で、Automation.AddAutomationPropertyChangedEventHandler を使って問題のプロパティが変更されるタイミングを報告するようにし、適当に UI を操作してどういうときに有効になるか確認する…というのが基本的な作業でしょうかね。
>
> 目的の ListItem が無効の場合、一旦 ComboBox を ExpandCollapsePattern で Expand&Collapse してやれば全ての ListItem が有効になると思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -