WPFで数字しか入力できないテキストボックスを作成する

WPFでテキストボックスを数字しか入力できないようにする方法を紹介します。

まず数字以外の文字が入力されたときに無視するためにPreviewTextInputイベントをつかいます

private void PreviewTextInput(object sender,TextCompositionEventArgs e)
{
int result = 0;
if (int.TryParse(e.Text, out result))
{

}
else
{
e.Handled = true;
}
}

デフォルトではなぜか半角スペースがPreviewTextInputに引っかからず入力できてしまうのですが、
実はスペースキー(及びシフトを押しながらスペースキー)を押したときの処理はEditingCommands.Space,(EditingCommands.ShiftSpace)という
internalな非公開の定義済みコマンドで行われています。CommandManager.PreviewExecutedイベントで存在を確認することができます。

InputBindingsでこれらのキー入力で呼び出すコマンドをApplicationCommands.NotACommandに置き換え、無効化すると
半角スペースの入力がPreviewTextInputイベントで拾えるようになります。

textbox.InputBindings.Add(new KeyBinding(ApplicationCommands.NotACommand, Key.Space, ModifierKeys.None));
textbox.InputBindings.Add(new KeyBinding(ApplicationCommands.NotACommand, Key.Space, ModifierKeys.Shift));

IME有効時の入力や、確定済み文字列の再変換ではPreviewTextInputイベントより先にTextChangedイベントが発生してしまいます。
やろうと思えば対処することもできるかもしれませんが、面倒くさいので
IMEモードを無効にします。

InputMethod.SetIsInputMethodEnabled(textbox, false);

入力された文字列を選択した状態でコンテキストメニューを開くと再変換の候補が表示されるため、
選択すると数字以外の文字に変換されてしまう可能性があります。

コンテキストメニュー周りはAppキー(キーボード右下あたりのハンバーガーメニューマークが印字されてるキー)や
Shift+F10ショートカットではApplicationCommands.ContextMenuが発生するが右クリックでは発生しない
ContextMenuOpeningイベントも発生したりしなかったりと動作が不安定なため、
textbox.ContextMenunullを代入してコンテキストメニュー自体を無効化します。

textbox.ContextMenu = null;

最後にクリックボードからの貼り付け(ペースト)対策です。
こちらはCommandBindingを使って、ApplicationCommands.Pasteの中身を書き換え
クリックボードの中身が数字の時のみペーストするようにします。

textbox.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, ExecutePaste));
private void ExecutePaste(object sender, ExecutedRoutedEventArgs e)
{
TextBox textbox = (TextBox)sender;
string text = Clipboard.GetText();

int result = 0;
if (int.TryParse(text, out result))
{
textbox.Paste();
}
else
{
}
}

これで、おそらく数字しか入力できなくなったはずです。

Styleなどでうまく使いまわせるようにしたかったのですが。
InputBindingsとCommandBindingsの設定がStyleでは難しそうだったので
Expression Blend SDKをつかってビヘイビアにしてみました。

[TypeConstraint(typeof(TextBox))]
public class NumericTextBoxBehavior : Behavior<TextBox>
{
private KeyBinding SpaceKeyBinding { get; set; }

private KeyBinding ShiftSpaceKeyBinding { get; set; }

private CommandBinding PasteCommandBinding { get; set; }

protected override void OnAttached()
{

this.AssociatedObject.ContextMenu = null;
InputMethod.SetIsInputMethodEnabled(this.AssociatedObject, false);

this.AssociatedObject.PreviewTextInput += PreviewTextInput;

this.SpaceKeyBinding = new KeyBinding(ApplicationCommands.NotACommand, Key.Space, ModifierKeys.None);
this.ShiftSpaceKeyBinding = new KeyBinding(ApplicationCommands.NotACommand, Key.Space, ModifierKeys.Shift);
this.PasteCommandBinding = new CommandBinding(ApplicationCommands.Paste, ExecutePaste);

AssociatedObject.InputBindings.Add(SpaceKeyBinding);
AssociatedObject.InputBindings.Add(ShiftSpaceKeyBinding);
AssociatedObject.CommandBindings.Add(PasteCommandBinding);

base.OnAttached();
}

protected override void OnDetaching()
{
base.OnDetaching();

AssociatedObject.InputBindings.Remove(SpaceKeyBinding);
AssociatedObject.InputBindings.Remove(ShiftSpaceKeyBinding);
AssociatedObject.CommandBindings.Remove(PasteCommandBinding);

this.SpaceKeyBinding = null;
this.ShiftSpaceKeyBinding = null;
this.PasteCommandBinding = null;

this.AssociatedObject.PreviewTextInput -= PreviewTextInput;
}

private void ExecutePaste(object sender, ExecutedRoutedEventArgs e)
{
TextBox textbox = (TextBox)sender;
string text = Clipboard.GetText();

int result = 0;
if (int.TryParse(text, out result))
{
textbox.Paste();
}
else
{
}
}

private void PreviewTextInput(object sender, TextCompositionEventArgs e)
{
int result = 0;
if (int.TryParse(e.Text, out result))
{

}
else
{
e.Handled = true;
}
}
}
広告
カテゴリー: C#, MVVM, XAML環境 | タグ: , , , , , , , , , , , , , , , , , | コメントをどうぞ

Salesforce VisualforceでURLパラメータをコントローラのメンバ変数として受け取る方法

VisualforceでコントローラーでURLパラメータを取得するには

ApexPages.currentPage().getParameters().get(param_name);

とする必要があるのですが。
できれば関数呼び出しなど行わず、最初から変数に代入されている形で取得したいです。

細かい検証はしていませんが、とりあえず実現できる方法を見つけたので紹介します。
まずapex:PageにはControllerを指定せずに、
カスタムコンポーネントを一つだけ配置し
Lightningの最上位コンポーネントと同じようにこのコンポーネントに表示内容を記述し、コントローラーもこちらに指定するようにします。

Viewでは

{!$CurrentPage.parameters.param_name}

でURLパラメータを取得することができるので、
apex:attributeを使い、URLパラメータをコンポーネントに渡し、assignTo属性でコントローラの変数に渡す事で
URLパラメータをControllerの変数に直接渡すことができます。

<apex:page >  
    <c:〇〇Component
        attr_name="{!$CurrentPage.parameters.param_name}" />
</apex:page>
<apex:component controller="〇〇Controller">
    <apex:attribute name="attr_name"
                    type="ID"
                    assignTo="{!param_name}"
                    description="url parameter" />
                   <!-- 略 -->
</apex:component>
public class 〇〇Controller {
    ID  param_name{set;get;} //←URLパラメータが代入される。
}

 

カテゴリー: Salesforce | タグ: , , , , , , , , , , , , , , , , , | コメントをどうぞ

Salesforce セキュリティトークンの発行方法 2017/12/08

最近Salesforceの勉強を始めました、
とりあえず、VisualStudio Codeの拡張機能ForceCodeで開発ができるらしいので、
試してみようと思ったのですが、なぜかエラーになってログイン・データの取得すらできません。

いろいろ調べた結果パスワードに末尾にセキュリティトークンをつける必要があるという事が分かったのですが。
設定メニューを見てもセキュリティトークンに関する項目が見当たりませんでした。

なんとか、セキュリティトークンの発行方法が分かったので手順書いておきます。

  1. 設定メニューから[ユーザ]>[ユーザ]を選んで[すべてのユーザ]画面を開く。
  2. (自分自身の)ユーザーを選択しユーザー情報の表示画面を開く。
  3. [パスワードを変更]ボタンをクリックして[私のパスワード変更]画面を開く。
  4. 左側のメニューの項目が変更されるので、
    その中から[私のセキュリティトークンのリセット]を選択し
    [私のセキュリティトークンのリセット]画面を開く。
  5. [セキュリティトークンのリセット]ボタンをクリックする。。
カテゴリー: Salesforce | タグ: , , , , , , | コメントをどうぞ

WPFのDataGridについて

WPFのDataGridではセルは編集中とそれ以外で表示するコントロールを切り替えることができ、
列ごとに種類を決めることがでます。

自分でテンプレートを設定できるDataGridTemplateColumnのほかに
編集中はTextBox、それ以外ではTextBlockになるDataGridTextColumn,
編集中はCombobox、それ以外ではTextBlockになるDataGridComboBoxColumn,
編集中も非編集中もCheckBoxな、DataGridCheckBoxColumn等が
あらかじめ用意されています。

セルの編集完了時、編集キャンセル時にCellEditEndingイベントが発生します。
編集中の列、行はそれぞれ
DataGridCellEditEndingEventArgsのメンバColumn、Rowで取得でき、
編集中のコントロール(ContentPesenter,TextBox,ComboBox,CheckBoxなど)はEditingElement
今が編集確定時、キャンセル時のどちらかなのかは、EditActionで取得できます。
また、Cancelにtrueを代入するとイベント終了後も編集状態を維持することができます。
ただし、Tabキーなどで選択セルを変更した場合遷移前と遷移後の両方のセルが編集状態になってしまうことがあるので注意が必要です。

行の編集が完了した時にはRowEditEndingイベントが発生します。
コントロールに入力した値がバインドしたViewModelに反映されるのはこのイベントの発生後になります。
そのためセルや行の編集中にセルに表示されている値を使用したい場合
ViewModelからではなく、コントロールから直接値を取得する必要があります。
DataGrid〇〇Columnオブジェクトから、編集時、非編集時の表示用コントロールを取得するには、
メンバのGetCellContent(DataGridRow)関数を使用します。
DataGridTemplateColumnの場合には取得できるのはContentPresenterなので
そこからテンプレートで指定したコントロールを取得する必要があり、
VisualTreeHelper.GetChild(DependencyObject,int)を使用することで実現できます。

セルが編集モードになる時には、PreparingCellForEditイベントが発生するので
編集中コントロールにデータを直接渡す必要があるときなどに使うと便利です。

カテゴリー: C#, MVVM, XAML環境 | タグ: , , , , , , , | コメントをどうぞ

いい案件の探し方に関する考察

最近、いい案件の探し方について考えている。

ある程度優秀な人が権限を握っていて
技術や、品質こだわれる案件。

最近、優秀で権限を握ってる人というのが
ほとんどいないという事がわかってきたので、
自分で権限を握ろうと思い始めたのだが、
権限を握るの未経験で権限を与えてくれる現場は
ほとんど無い気がする。

よく考えたら今までの案件、
常駐先の社員が権限を握っていて
その指揮下にはいる前提の案件が多かった気がする。

冷静に考えたら、指揮下にはいる前提の案件で
仮にいくら活躍しても権限握るの難しくね?
まあ、品質にこだわれなくて活躍のしようがないことの方が多いのだが……

そういえば、知り合いにフリーランスのプロマネとか結構いる。
その人達は当然、権限を握る前提の契約をしてるはずで、
という事は、お客さんも、外部の人に権限を与える事を割と普通に考えてる?

という事は、最初は権限無くても活躍次第では権限を握れる可能性があるかも?
というか、権限を持った人が優秀な可能性も結構高いかも?

いまいち、どういう案件かよくわからないけど、
社員じゃなくて、外部の人がPLとかPMとかやってる案件に絞り込めば、
いい案件に当たる確率、自分が権限を握れる確率アップするんじゃないだろうか?

という所まで考えたんだけど、当たってるんだろうか?

カテゴリー: その他 | コメントをどうぞ

TypeScript 1 とりあえずプロジェクトを作ってみる。

仕事でTypeScriptを使うことになったのでとりあえず勉強してみます。

一度、HTML抜きのTypeScript言語そのもので勉強したいのでそれっぽいプロジェクトを探してみたところ
TypeScript>Node.js の下に
空の Node.js コンソール アプリケーション
というのがあったのでとりあえず、このプロジェクトを作ってみました

ビルドするとプロジェクトには追加されませんが
app.tsと同じディレクトリにapp.jsが生成されます。
並べて表示させると変換前のTypeScript,変換後のJavaScript
両方を確認しながら作業ができるので便利です。

カテゴリー: その他 | コメントをどうぞ

IT proで見つけた設計・ITアーキテクト関連記事まとめ

自分ももう30歳ということで、
面談でリーダー経験・設計経験(SE職でのプロジェクト参加経験) 等を問われることが多くなってきました。
経験がないので当然合格できません。
(そもそも何設計がどこからどこまでのことを指しているのかよくわからない、
 コーディングは設計であるみたいな記事もどこかで読んだことがある。)

業務での経験はないけど、正直必要な情報さえそろっていれば
ゼロからでも良い品質のソフトウェアを作る自信があるので
多分 その際の思考を適当にドキュメント化すれば、
設計(設計書作成工程)もできるしそういった経験が求められる案件でも多分どうにかなるだろうと思っていて、
案件を探してもらってる営業さんたちにもその様に伝えていたのですが

少し不安になったので試しにITproでいろいろ検索してみました。
面白そうな記事・連載をいくつか見つけたので紹介します。
というか後で自分で読むためのまとめです。
(各記事は執筆時の情報に基づいており、現在では異なる場合があります)

  • 週末スペシャル 改めて考えるITエンジニアとITアーキテクトの違い 松山 貴之 2013/05/10
    http://itpro.nikkeibp.co.jp/article/COLUMN/20130508/475456/
    著書 松山 貴之氏のこれまでに(執筆時)関わったITアーキテクトの記事のまとめです。

  • 連載 基本設計の基礎(全5回) (2007/07/05~2007/07/11)
    http://itpro.nikkeibp.co.jp/article/lecture/20070419/268969/
    日経ITプロフェッショナル 2005年12月号に掲載された物で。
    技術や製品の多様化,不十分な要件定義の増加,オフショア開発の進展などにより,基本設計の難易度がますます上がっている。一方で開発の現場では…

  • 連載 だれも教えてくれなかった外部設計の「極意」(全13回) (2008/05/21~2008/11/27)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20080515/301810/
    外部設計書で最も大切なことは,「システム開発を依頼してきたお客様」(発注者)に読んでもらい,理解してもらうことです。
カテゴリー: その他 | タグ: , , , , , | コメントをどうぞ