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

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

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

画面内のすべてのコントロールをTabIndex順に取得したいのですが。


(過去ログ 7 を表示中)

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

■7689 / inTopicNo.1)  画面内のすべてのコントロールをTabIndex順に取得したいのですが。
  
□投稿者/ mizuki 二等兵(14回)-(2006/10/23(Mon) 11:11:06)

分類:[C#] 


分類:[C#] 

いつもお世話になってます。

タイトルにも書かせて頂いたのですが、
画面内のすべてのコントロールをTabIndex順に
配列化したいです。

用途は、ボタン押下時にTabIndex順に入力チェックを
して行きたいのです。

以下の様にコントロールの一覧を取得する関数は
既存のソースにあったのですが、TabIndex順にする所がなかったので・・・

「既存ソース」
private void GetFormTextControl( Control hParent , ref Control[] ctrls )
{
  // hParent 内のすべてのコントロールを列挙する
  foreach( Control hControl in hParent.Controls )
  {
    // 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする
    if( hControl.HasChildren == true )
    {
      GetFormTextControl( hControl , ref ctrls );
    }
      if( ctrls == null )
      {
        ctrls = new Control[ 1 ] { ( Control )hControl };
      }
      else
      {
        Array.Resize( ref ctrls , ctrls.Length + 1 );
        ctrls.SetValue( ( Control )hControl , ctrls.Length - 1 );
      }
  }
}


0
引用返信 編集キー/
■7691 / inTopicNo.2)  Re[1]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ まどか 中将(270回)-(2006/10/23(Mon) 11:37:34)

分類:[C#] 

> 画面内のすべてのコントロールをTabIndex順に
> 配列化したいです。

Arrayなら
Array.Sort メソッド (Array, IComparer) でカスタムソートすればよいです。


参照渡しで配列を動的に扱ってますが、その必要は無いと思われます。
#参照渡しはその必要性がある場合のみ使います。
#ってC#でもそうですよね?>ALL
コレクションにすれば、値渡しでプロシージャ内でAddするだけです。
また、プロシージャ内で作成したコレクションインスタンスを返す関数にしてもよいでしょう。
SortedListクラスまたはSortedList(Of T)クラスを使えばソートの実装はいりませんし。

0
引用返信 編集キー/
■7692 / inTopicNo.3)  Re[2]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ mizuki 二等兵(15回)-(2006/10/23(Mon) 12:00:47)

分類:[C#] 

No7691に返信(まどかさんの記事)
>>画面内のすべてのコントロールをTabIndex順に
>>配列化したいです。
>
> Arrayなら
> Array.Sort メソッド (Array, IComparer) でカスタムソートすればよいです。
>
>
> 参照渡しで配列を動的に扱ってますが、その必要は無いと思われます。
> #参照渡しはその必要性がある場合のみ使います。
> #ってC#でもそうですよね?>ALL


すみません。なんとなく意味はわかるのですが・・
上記のソースを引用するより、もっと最適なソースを記述できるって言う意味でいいですか?

> コレクションにすれば、値渡しでプロシージャ内でAddするだけです。
> また、プロシージャ内で作成したコレクションインスタンスを返す関数にしてもよいでしょう
これは、private collection SortTabIndexList( Control hParent ) {}
見たいに関数を作成して、内部でコレクションに追加する
みたいな感じでしょうか?

人だよりなのはわかるのですが、サンプルを頂いても良いですか?
> SortedListクラスまたはSortedList(Of T)クラスを使えばソートの実装はいりませんし。
については、勉強します。

すみません、よろしくおねがいします。

0
引用返信 編集キー/
■7693 / inTopicNo.4)  Re[3]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ ダッチ 伍長(57回)-(2006/10/23(Mon) 12:38:07)

分類:[C#] 

> 用途は、ボタン押下時にTabIndex順に入力チェックを
> して行きたいのです。

コンテナ内のコントロールで TabIndex が振られていきます。
そのため同じ TabIndex を持つコントロールが複数見つかると思いますが、
そういった場合の順番は大丈夫ですか。

0
引用返信 編集キー/
■7694 / inTopicNo.5)  Re[4]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ mizuki 二等兵(16回)-(2006/10/23(Mon) 12:54:16)

分類:[C#] 

No7693に返信(ダッチさんの記事)
>>用途は、ボタン押下時にTabIndex順に入力チェックを
>>して行きたいのです。
>
> コンテナ内のコントロールで TabIndex が振られていきます。
> そのため同じ TabIndex を持つコントロールが複数見つかると思いますが、
> そういった場合の順番は大丈夫ですか。

基本的には、大丈夫だと思います。
画面の左上から順に、TabIndexを設定するようにします。
チェックしたいのは、TextBoxなので、TextboxBase で判断出来ると思います。


0
引用返信 編集キー/
■7697 / inTopicNo.6)  Re[3]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ まどか 中将(271回)-(2006/10/23(Mon) 13:53:49)

分類:[C#] 

>>また、プロシージャ内で作成したコレクションインスタンスを返す関数にしてもよいでしょう
> これは、private collection SortTabIndexList( Control hParent ) {}
> 見たいに関数を作成して、内部でコレクションに追加する
> みたいな感じでしょうか?

こんな感じかな?>試行錯誤しながらC#で書いてみた。(汗
GetTextBoxesへフォームを渡します。

#スコープとかまだ不安、誰か添削して。

private SortedList<Int32, Control> GetTextBoxes(Control ParentControl)
{
SortedList<Int32,Control> ResultCollection = new SortedList< int32,Control> ();
GetTextBoxesReflexively(ParentControl, ResultCollection);
return ResultCollection;
}
private void GetTextBoxesReflexively(Control ParentControl,SortedList<Int32,Control> ResultCollection)
{
foreach (Control obj in ParentControl.Controls)
{
if (obj.HasChildren)
{
GetTextBoxesReflexively(obj, ResultCollection);
}
else
{
// TextBoxの判断をして //
ResultCollection.Add(obj.TabIndex, obj);
}
}
}

0
引用返信 編集キー/
■7698 / inTopicNo.7)  Re[5]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ 魔界の仮面弁士 少佐(189回)-(2006/10/23(Mon) 14:12:35)

分類:[C#] 

階層関係が下記のようになっていた場合、TextBox の順番はどうしますか?

[フォーム]
┣[panel1] … TabIndex=2
┃┣[textBox1] … TabIndex=2
┃┗[textBox2] … TabIndex=0
┣[panel2] … TabIndex=3
┃┣[textBox3] … TabIndex=1
┃┗[textBox4] … TabIndex=3
┣[textBox5] … TabIndex=1
┗[textBox6] … TabIndex=0


(1) TabIndex = 0 のコントロールが複数あります。
 この場合の並び順は?

(2) textBox1〜4は、それぞれTabIndexが異なりますが、Parent が異なります。
 この場合の並び順は?

(3) もしも同一階層内に、同じ TabIndex を持つ TextBox があった場合は?

0
引用返信 編集キー/
■7699 / inTopicNo.8)  Re[6]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ まどか 中将(272回)-(2006/10/23(Mon) 14:41:36)

分類:[C#] 

> 階層関係が下記のようになっていた場合、TextBox の順番はどうしますか?

そっかそっか。
じゃぁデザイナのタブオーダーみたいに0.1.2の形式でソートするってのが思いつきますね。
#再帰の中でくっつければいいですもんね。

0
引用返信 編集キー/
■7701 / inTopicNo.9)  Re[4]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ ダッチ 伍長(58回)-(2006/10/23(Mon) 15:04:53)

分類:[C#] 

No7698に返信(魔界の仮面弁士さんの記事)
私の言いたいことをわかりやすく説明してくださってありがとうございます。

> 基本的には、大丈夫だと思います。
> 画面の左上から順に、TabIndexを設定するようにします。
> チェックしたいのは、TextBoxなので、TextboxBase で判断出来ると思います。

ということですので、必ず TabIndex がかぶらないように設定するみたいですね。
でもやっぱり心配です。対応方法は本当にいらないのでしょうか。


0
引用返信 編集キー/
■7702 / inTopicNo.10)  Re[7]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ 魔界の仮面弁士 少佐(190回)-(2006/10/23(Mon) 15:15:00)

分類:[C#] 

No7697に返信(まどかさんの記事)
> #スコープとかまだ不安、誰か添削して。

同じ TabIndex があった場合の対処は置いとくとして……

> = new SortedList< int32,Control> ();
で、微妙にスペルミスしている点とか、かな。


No7698に返信(自分の記事)
> [フォーム]
> ┣[panel1] … TabIndex=2
> ┃┣[textBox1] … TabIndex=2
> ┃┗[textBox2] … TabIndex=0
> ┣[panel2] … TabIndex=3
> ┃┣[textBox3] … TabIndex=1
> ┃┗[textBox4] … TabIndex=3
> ┣[textBox5] … TabIndex=1
> ┗[textBox6] … TabIndex=0

上記のパターンで、
 textBox6, textBox5, textBox2, textBox1, textBox3, textBox4
の順になるようにしてみました。あんまりテストしてませんけど。(汗


/**** C# 2.0 で書いたので、.NET 1.x では動きません。****/

private void Form1_Load(object sender, EventArgs e)
{
TextBoxBase[] textBoxes = GetAllControls<TextBoxBase>(this);

//チェック用
foreach (TextBoxBase textBox in textBoxes)
{
Trace.WriteLine(String.Format("TabIndex={0} - Name=\"{1}\"",
textBox.TabIndex, textBox.Name));
}
}

//すべての子孫コントロールを列挙して、TabIndex順に返す。
private Control[] GetAllControls(Control parentControl)
{
if (parentControl == null)
{
throw new ArgumentNullException();
}

//順序無視で追加(子コントロールは含めない)。
List<Control> controls = new List<Control>();
foreach (Control control in parentControl.Controls)
{
controls.Add(control);
}

//TabIndex順にソートする。
controls.Sort(delegate(Control x, Control y) { return x.TabIndex - y.TabIndex; });

//再帰して、子コントロールを挿入する。
for (int i = controls.Count - 1; i >= 0; i--)
{
Control container = controls[i];
if (container.HasChildren)
{
controls.InsertRange(i, GetAllControls(container));
}
}
return controls.ToArray();
}

//コントロールの配列を、コントロールの型でフィルタする。
public T[] GetAllControls<T>(Control parentControl) where T : Control
{
List<Control> controls = new List<Control>(GetAllControls(parentControl));
List<Control> filtered = controls.FindAll(delegate(Control c) { return c is T; });
return Array.ConvertAll<Control, T>(filtered.ToArray(),
delegate(Control value) { return value as T; });
}


0
引用返信 編集キー/
■7703 / inTopicNo.11)  Re[8]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ 魔界の仮面弁士 少佐(191回)-(2006/10/23(Mon) 15:22:30)

分類:[C#] 

No7702に返信(自分の記事)
> あんまりテストしてませんけど。(汗

早速バグ発見。(泣


> private Control[] GetAllControls(Control parentControl)
> {
>      …… 略 ……
>  controls.InsertRange(i, GetAllControls(container));
>      …… 略 ……
> }

誤) controls.InsertRange(i, GetAllControls(container));
正) controls.InsertRange(i + 1, GetAllControls(container));

0
引用返信 編集キー/
■7704 / inTopicNo.12)  Re[5]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ ぽぴ王子 軍曹(68回)-(2006/10/23(Mon) 15:37:48)
ぽぴ王子 さんの Web サイト

分類:[C#] 

No7701に返信(ダッチさんの記事)

こんにちは。

ダッチさんと同じ懸念は私も思っていたので、mizuki さんに伝わっているか
どうかが気になっていたところでした。
私としても魔界の仮面弁士さんの解説はわかりやすくて良かったです。

mizuki さんには、魔界の仮面弁士さんの案で言う (3) しか伝わっていない
ような印象を受けたもので。
だったとしても
> 基本的には、大丈夫だと思います。
> 画面の左上から順に、TabIndexを設定するようにします。
だとちょっと不安かな…
世の中には絶対ということはありえないので、mizuki さんが正しく TabIndex
を振っていたとしても、他の誰かが同じ番号の TabIndex を割り振る可能性も
ありますし、またご自身ですっかり忘れて以下略、ということも。
そういったときのためにフェイルセーフとかフールプルーフとか、そういった
考え方に基づいてコーディングするのは大事かもしれませんね。

0
引用返信 編集キー/
■7705 / inTopicNo.13)  Re[9]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ mizuki 二等兵(17回)-(2006/10/23(Mon) 15:39:33)

分類:[C#] 

すみません。
質問者が、放置してしまって・・・

チョット忙しくて、掲示板見れてなくて、今見たのですが・・

まどかさん、ダッチさん、魔界の仮面弁士さん
サンプルソースありがとうございます。

魔界の仮面弁士のサンプルを実装して、イメージしている
動きになるか、確認して返事します。

色々、ご迷惑をおかけして、すみませんでした。

0
引用返信 編集キー/
■7706 / inTopicNo.14)  Re[8]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ まどか 中将(273回)-(2006/10/23(Mon) 15:43:21)

分類:[C#] 

>>= new SortedList< int32,Control> ();
> で、微妙にスペルミスしている点とか、かな。

よく見たら、色が違ってました。。。そうそう大小の区別があるんでしたね。

> List<Control> filtered = controls.FindAll(delegate(Control c) { return c is T; });

これは「役に立った」ボタン押しときました。
#今まで列挙してコレクションインスタンス返してましたよ。
なかなか隅々までMSDN見るのは大変です。。。

0
引用返信 編集キー/
■7707 / inTopicNo.15)  Re[6]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ mizuki 二等兵(18回)-(2006/10/23(Mon) 15:55:00)

分類:[C#] 

No7704に返信(ぽぴ王子さんの記事)
> ■No7701に返信(ダッチさんの記事)
>
> こんにちは。
>
> ダッチさんと同じ懸念は私も思っていたので、mizuki さんに伝わっているか
> どうかが気になっていたところでした。
> 私としても魔界の仮面弁士さんの解説はわかりやすくて良かったです。
>
> mizuki さんには、魔界の仮面弁士さんの案で言う (3) しか伝わっていない
> ような印象を受けたもので。
> だったとしても
>>基本的には、大丈夫だと思います。
>>画面の左上から順に、TabIndexを設定するようにします。
> だとちょっと不安かな…
> 世の中には絶対ということはありえないので、mizuki さんが正しく TabIndex
> を振っていたとしても、他の誰かが同じ番号の TabIndex を割り振る可能性も
> ありますし、またご自身ですっかり忘れて以下略、ということも。
> そういったときのためにフェイルセーフとかフールプルーフとか、そういった
> 考え方に基づいてコーディングするのは大事かもしれませんね。

すみません。
確かに言われる通りだと思います。
簡単に考えすぎていました。

VB6の頃は、TabIndex がダブル事が無かったので、
あまり意識していなかったので、改めて質問されると、
どのように対応していいか、わからなかったです。

魔界の仮面弁士の心配だからのコーディングは、凄く助かります。
今後は、可能性を出来るだけ考えてコーディングしていきたいです。


0
引用返信 編集キー/
■7708 / inTopicNo.16)  Re[7]: 画面内のすべてのコントロールをTabIndex順に取得したいのですが。
□投稿者/ mizuki 二等兵(19回)-(2006/10/23(Mon) 15:59:07)

分類:[C#] 

No7702に返信(mizukiさんの記事)
サンプルソースありがとうございました。

delegateの使い方が、わかってないので、勉強します。

実装して、出力結果を確認させて頂きました。
イメージの通りの配列になっているので、
とても助かりました。

質問者不在でありながら、色々仕様の検討までして頂いて
ありがとうございます。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -