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

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

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

Re[19]: チェックボックスを使った計算


(過去ログ 153 を表示中)

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

■89099 / inTopicNo.1)  チェックボックスを使った計算
  
□投稿者/ コジコジ (1回)-(2018/10/31(Wed) 14:35:31)

分類:[.NET 全般] 

初めての投稿です。
よろしくお願いいたします。

チェックボックスがたくさんあり、いくつかクリックし実行ボタンを押して「1000」を超えるとラベルに「1000を超えました」と表示させたいです。

チェックボックス自体に数値を持たせることが可能でしょうか。
それともラベル、テキストボックス等に数値を持たせないといけないでしょうか。

殆ど素人なのに仕事で無茶ぶりされてます・・・。

先生方お手数ではございますがよろしくお願いいたします。
引用返信 編集キー/
■89101 / inTopicNo.2)  Re[1]: チェックボックスを使った計算
□投稿者/ 774RR (639回)-(2018/10/31(Wed) 14:55:37)
何作ってるんでしょうか? Win Forms と Web Forms では全然違います。

Win Forms であるとして、コントロールのプロパティの一つに Tag ってのがあります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.control.tag
Windows 自体はこの Tag を一切使わないうえ、任意のオブジェクトを格納できるというもの。

それに数値入れるとおよそやりたいことは達成できるかと。

引用返信 編集キー/
■89103 / inTopicNo.3)  Re[1]: チェックボックスを使った計算
□投稿者/ WebSurfer (1638回)-(2018/10/31(Wed) 15:02:00)
No89099 (コジコジ さん) に返信

CheckBox コンロトールというのは Windows Forms, WPF, ASP.NET Web Forms などにあり
ますが、どれの話ですか?

また、自分の開発環境(OS, .NET, Visual Studio のバージョン、使用言語など)は書け
ませんか?

引用返信 編集キー/
■89105 / inTopicNo.4)  Re[2]: チェックボックスを使った計算
□投稿者/ コジコジ (3回)-(2018/10/31(Wed) 15:14:22)
774RR様、ご返答ありがとうございます。

「tag」の件理解しました。
こんな便利な物があるんですね。

CheckBox1
CheckBox2
CheckBox3
  ・
  ・
  ・

の、タグに数値を持たせて、チェックを複数してボタンを押したら
そのタグに設定している数値の合計をラベルに表示させるようにしたいです。

VisualBasic2010を使用しております。
下手な説明で申し訳ありません。
引用返信 編集キー/
■89106 / inTopicNo.5)  Re[3]: チェックボックスを使った計算
□投稿者/ コジコジ (4回)-(2018/10/31(Wed) 15:16:28)
WebSurfer様、ご返答ありがとうございます。

申し訳ありません。
VisualBasic2010を使用していて、VB.netだと思います。
引用返信 編集キー/
■89107 / inTopicNo.6)  Re[4]: チェックボックスを使った計算
□投稿者/ WebSurfer (1640回)-(2018/10/31(Wed) 15:35:46)
No89106 (コジコジ さん) に返信

> VisualBasic2010を使用していて、VB.netだと思います。

Windows Forms, WPF, ASP.NET Web Forms のどれですかというのが私の質問なのですが・・・

Visual Studio 2010 のテンプレートを使ってプロジェクトを作ったと思いますが、その時何を
使ったか覚えてませんか?
引用返信 編集キー/
■89108 / inTopicNo.7)  Re[3]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1908回)-(2018/10/31(Wed) 15:41:19)
2018/10/31(Wed) 15:50:56 編集(投稿者)

No89105 (コジコジ さん) に返信
>>> いくつかクリックし実行ボタンを押して「1000」を超えると
「たくさんのチェックボックス」というのが、幾つあるのかは分かりませんが、
どうやら CheckBox のクリック数が 1000 回を超えた時…という話ではなさそうですね。

>>> ラベルに「1000を超えました」と表示させたいです。
1000 を超えた時にそのメッセージを表示させるとして、
1000 以下だった場合に、そのラベルの表示はどうなりますか?


> タグに数値を持たせて、チェックを複数してボタンを押したら
> そのタグに設定している数値の合計をラベルに表示させるようにしたいです。

Tag プロパティには、任意のデータ(自作クラスでも可)を指定できます。
整数をセットすることもできますが、デザイン時に指定した場合には
文字列がセットされることにご注意ください。

ですので、合計する際にはデータ型の違いにもご注意ください。
整数としての 10 と、文字列としての "10" では扱い方も変わってきます。


とりあえず、こんな感じでどうでしょう。

(1) Form1 上に、Panel1 と Button1 と Label を貼っておきます。
(2) Form1 の Panel1 の上に、CheckBox1〜CheckBox5 を貼ります。
(3) Button1 の Text プロパティに「実行」と記述します。
(4) Form1 の Load イベントに、以下のコードを記述します。

CheckBox1.Tag = 100
CheckBox2.Tag = 200
CheckBox3.Tag = 300
CheckBox4.Tag = 400
CheckBox5.Tag = 500

(5) Button1 の Click イベントに、以下のコードを記述します。

Dim total As Integer = Panel1.Controls.OfType(Of CheckBox)().Sum(Function(c) If(c.Checked, CInt(c.Tag), 0))
Label1.Text = If(total > 1000, "1000を超えました", "")


> VisualBasic2010を使用しております。
VB2010 で「新しいプロジェクト」を作成する場合、
プロジェクト テンプレートとして

・Windows フォーム アプリケーション
・WPF アプリケーション
・コンソール アプリケーション
・ASP.NET Web アプリケーション
・ASP.NET MVC 2 Web アプリケーション
・ASP.NET MVC 4 Web アプリケーション
・Silverlight アプリケーション

などなど、幾つかの種類があったかと思います。

また、.NET Framework 2.0 や .NET Framwork 4 など、どのバージョンの
.NET Framework を対象にしているかによって、プログラムの書き方が
微妙に異なってくることもあります。ご注意ください。


※今回提示した VB2010 向けのサンプルは、
 .NET Framework 4 + Windows フォーム アプリケーション
 という組み合わせを想定しています。
引用返信 編集キー/
■89109 / inTopicNo.8)  Re[5]: チェックボックスを使った計算
□投稿者/ コジコジ (5回)-(2018/10/31(Wed) 15:44:45)
WebSurfer様、申し訳ございません。

たびたび申し訳ございません。
Windows Formsです。


魔界の仮面弁士様、詳しくありがとうございます。
少しやってみます。

別作業をしながらなので少し返信が遅れ、申し訳ありません。
引用返信 編集キー/
■89110 / inTopicNo.9)  Re[6]: チェックボックスを使った計算
□投稿者/ コジコジ (6回)-(2018/10/31(Wed) 16:17:14)
魔界の仮面弁士様

Windows フォーム アプリケーションで作成しています。

TabControlを使用して、tabを25個作っています。
その中でチェックボックスが500個ほどあります。

ですので頂きましたコードが使えない状況です。

説明不足で申し訳ございません。
引用返信 編集キー/
■89111 / inTopicNo.10)  Re[7]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1909回)-(2018/10/31(Wed) 16:33:05)
No89110 (コジコジ さん) に返信
> ですので頂きましたコードが使えない状況です。

問題になっているのは、どの部分でしょうか?


> TabControlを使用して、tabを25個作っています。
> その中でチェックボックスが500個ほどあります。

コントロール数が多すぎる時点で、そもそもの
画面デザインに問題がある気もしますが、それはさておき。


先のコードで言うと、「Panel1.Controls.OfType(Of CheckBox)()」の部分を
「TabPage1.Controls.OfType(Of CheckBox)()」や
「TabControl1.SelectedTab.Controls.OfType(Of CheckBox)()」に
置き換えることは、そう難しくは無いと思います。

となると、500 個のチェックボックスに Tag を設定するのが煩わしい、という話でしょうか?


どのチェックボックスがどの値になるのか、という情報については、
コジコジ さん自身にしか分からない事なので、各チェックボックスとの関連付けは、
実行時あるいはデザイン時に、御自身で指定していただくしかありません。

ただし、チェックボックスの Text や Name、あるいは位置関係などを見ることで、
それぞれの数値を判断することができるのであれば、その判定処理を
プログラムに盛り込むことは可能でしょう。
引用返信 編集キー/
■89112 / inTopicNo.11)  Re[8]: チェックボックスを使った計算
□投稿者/ コジコジ (7回)-(2018/10/31(Wed) 16:54:15)
魔界の仮面弁士様
ご返信ありがとうございます。

誠に申し訳ございません。
当方の勘違いでございました。

動作確認いたしました。
希望通りの動作でした。

一点、希望ですが、チェックするごとに計算式が見えるようにする方法はございますでしょうか。

CheckBox1.Tag = 100
CheckBox2.Tag = 200
CheckBox3.Tag = 300

3個チェックしたら、「100+200+300=600」と違うラベルに出ると望ましいです。

お手数ではございますが何卒よろしくお願い申し上げます。
引用返信 編集キー/
■89113 / inTopicNo.12)  Re[9]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1910回)-(2018/10/31(Wed) 17:17:10)
2018/10/31(Wed) 17:20:29 編集(投稿者)

No89112 (コジコジ さん) に返信
> 当方の勘違いでございました。

ちなみに、選択されていないタブも含めるなら SelectMany で平坦化できます。

Dim total As Integer = TabControl1.TabPages.Cast(Of TabPage)().SelectMany(Function(t) t.Controls.OfType(Of CheckBox)()).Sum(Function(c) CInt(c.Tag))


> 一点、希望ですが、チェックするごとに計算式が見えるようにする方法はございますでしょうか。
> 3個チェックしたら、「100+200+300=600」と違うラベルに出ると望ましいです。

仕様がまだまだ曖昧です。

まず、何も選択されていない場合、= の左辺はどのように表記されるのでしょうか。
それとも、何も選択されていない場合は空欄にするのでしょうか。

また、計算式の各項の並び順をどうするのかも不明瞭です。
たとえば、数値の昇順、クリック順、コントロールの位置や名前順などなど。



Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  CheckBox1.Tag = 100
  CheckBox2.Tag = 200
  CheckBox3.Tag = 300
  CheckBox4.Tag = 400
  CheckBox5.Tag = 500
  For Each c As CheckBox In Panel1.Controls.OfType(Of CheckBox)()
    AddHandler c.CheckedChanged, Sub() UpdateFormula()
  Next
End Sub

Private Sub UpdateFormula()
  Dim values = Panel1.Controls.OfType(Of CheckBox)().Where(Function(c) c.Checked).Select(Function(c) c.Tag)
  If values.Any() Then
    Label2.Text = String.Join("+", values.OrderBy(Function(i) i)) & "=" & values.Cast(Of Integer)().Sum().ToString("N0")
  Else
    Label2.Text = "0"
  End If
End Sub
引用返信 編集キー/
■89116 / inTopicNo.13)  Re[10]: チェックボックスを使った計算
□投稿者/ コジコジ (8回)-(2018/10/31(Wed) 18:01:06)
魔界の仮面弁士様

ご返信ありがとうございます。

理想的な動きで感動しています。


選択されていないタブは含みません。

うまく仕様をお伝え出来ず申し訳ございません。

頂いたコードを使用しましたらボタンが不要と気づきました。

きちんと整理しました。

・ボタンは不要(チェック時にラベル1とラベル2に表示)
・最初のチェック時、tagが100の時に「100=100」とはならず、「100」と表示
・合計が
1000を超えない場合はラベル1に「1000を超えていません」
1000を超えたら、ラベル1に「1000を超えました」
2000を超えたら、ラベル1に「2000を超えました」と表示


計算式の並び順は「クリック順」です。

よろしくお願いいたします。
引用返信 編集キー/
■89117 / inTopicNo.14)  Re[11]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1912回)-(2018/10/31(Wed) 18:15:20)
No89116 (コジコジ さん) に返信
> ・ボタンは不要(チェック時にラベル1とラベル2に表示)
> ・最初のチェック時、tagが100の時に「100=100」とはならず、「100」と表示
> ・合計が
> 1000を超えない場合はラベル1に「1000を超えていません」
> 1000を超えたら、ラベル1に「1000を超えました」
> 2000を超えたら、ラベル1に「2000を超えました」と表示
> 計算式の並び順は「クリック順」です。

全部のチェックが解除された場合の条件が漏れているような…。


それと、『やりたいこと』は分かりましたが、
肝心の『質問』が書かれていないようです。

これはもはや「開発依頼」であろうかと思いますので、
後ほど、開発費用を請求させ(以下略


Public Class Form1
  Private checked As New List(Of CheckBox)()

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CheckBox1.Tag = 100
    CheckBox2.Tag = 200
    CheckBox3.Tag = 300
    CheckBox4.Tag = 400
    CheckBox5.Tag = 500
    For Each chk As CheckBox In Panel1.Controls.OfType(Of CheckBox)()
      AddHandler chk.CheckedChanged, _
        Sub(c As CheckBox, arg As EventArgs)
          If c.Checked Then
            checked.Add(c)
          Else
            checked.Remove(c)
          End If
          Dim values = checked.Select(Function(o) o.Tag).ToArray()

          Dim total As Integer = values.Cast(Of Integer)().Sum()
          If total > 2000 Then
            Label1.Text = "2000を超えました"
          ElseIf total > 1000 Then
            Label1.Text = "1000を超えました"
          Else
            Label1.Text = "1000を超えていません"
          End If

          If values.Length = 0 Then
            Label2.Text = ""
          ElseIf values.Length = 1 Then
            Label2.Text = total.ToString("N0")
          Else
            Label2.Text = String.Join("+", values.Select(Function(v) String.Format("{0:N0}", v))) & "=" & total.ToString("N0")
          End If
        End Sub
    Next
  End Sub
End Class
引用返信 編集キー/
■89120 / inTopicNo.15)  Re[12]: チェックボックスを使った計算
□投稿者/ コジコジ (9回)-(2018/10/31(Wed) 21:38:41)
魔界の仮面弁士様
ご返信ありがとうございます。

家に帰って実践しています。

全部のチェックが外れた場合は、全てのラベルはクリアとなります。
質問ではなくて開発依頼になってしまいましたね。
申し訳ございません。
飲みにでもいけたらいいのですが・・・。

頂きましたコードで完璧でした。

ですが、一点困ったことがあります。

「TabControl」で使用しようと、
「Panel1.Controls.OfType」から
「TabControl1.SelectedTab.Controls.OfType」に変更したのですが、
動作しませんでした。

正確には「TabPage1」は動作し、「TabPage2」以降は無反応でした。

動作する方法はございますでしょうか。

何卒よろしくお願いいたします。
引用返信 編集キー/
■89121 / inTopicNo.16)  Re[13]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1914回)-(2018/10/31(Wed) 22:34:46)
No89120 (コジコジ さん) に返信
> 「TabControl」で使用しようと、
> 「Panel1.Controls.OfType」から
> 「TabControl1.SelectedTab.Controls.OfType」に変更したのですが、
> 動作しませんでした。

SelectedTab プロパティは、「TabControl 上で現在選択されている TabPage」を返します。

ゆえに Load イベントの時点では、
TabControl1.SelectedTab.Controls.OfType(Of ) は
TabPage1.Controls.OfType(Of ) と同義になってしまうためです。

最初の AddHandler については、選択タブとは関係なく、
すべての CheckBox に対して割り当てるように書き換えましょう。


また、クリック順を保持するための List(Of CheckBox) の管理にも注意が必要です。

先のコードでにある、Private checked As New List(Of CheckBox)() には
「選択された CheckBox」を、チェックされた順に
記録されるための変数です。しかしそれゆえ、そのまま真似ると、
TabPage1 上のチェックボックスと
TabPage2 上のチェックボックスが
混在して記録されてしまう事になります。

しかし、今回の仕様では、
>> 選択されていないタブは含みません。
という条件が含まれますので、別のタブにある CheckBox が
混じってしまうと、少々都合が悪いでしょう。


そこで、それぞれのタブごとに分けてカウントできるようにするために、

(案1) 25 個のタブそれぞれのために、List(Of ) のインスタンスも 25 個用意して対処する。

(案2) 1 つの List(Of ) 内に、すべての TabPage 上のチェックボックスを混在して格納するが、
 Label に表示する際に、どのページ上の CheckBox なのかを判断して集計させる。

のいずれかの対処をとるといった方法が思い当たります。
引用返信 編集キー/
■89122 / inTopicNo.17)  (削除)
□投稿者/ -(2018/10/31(Wed) 22:49:38)
この記事は(投稿者)削除されました
引用返信 編集キー/
■89125 / inTopicNo.18)  Re[14]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1918回)-(2018/10/31(Wed) 23:06:29)
No89121 (魔界の仮面弁士) に追記
> (案2) 1 つの List(Of ) 内に、すべての TabPage 上のチェックボックスを混在して格納するが、
>  Label に表示する際に、どのページ上の CheckBox なのかを判断して集計させる。


案2 による実装例です。


Public Class Form1
  Private checked As New List(Of CheckBox)()

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'TabPage1 上にあると仮定
    CheckBox1.Tag = 100
    CheckBox2.Tag = 200
    CheckBox3.Tag = 300
    CheckBox4.Tag = 400
    CheckBox5.Tag = 500

    'TabPage2 上にあると仮定、以下同様
    CheckBox6.Tag = 200
    CheckBox7.Tag = 400
    CheckBox8.Tag = 600
    CheckBox9.Tag = 800
    CheckBox10.Tag = 1000


    'それぞれのタブページ上にある CheckBox をすべて列挙
    For Each chk As CheckBox In TabControl1.TabPages.OfType(Of TabPage)().SelectMany(Function(p) p.Controls.OfType(Of CheckBox)())

      'それぞれの CheckBox の CheckedChanged イベントに割り当て
      AddHandler chk.CheckedChanged,
        Sub(c As CheckBox, arg As EventArgs)
          If c.Checked Then
            checked.Add(c)
          Else
            checked.Remove(c)
          End If

          UpdateFormula() 'Label を更新するための処理
        End Sub
    Next

    '別のタブが選択された場合も、Label の表示は切り替わる
    AddHandler TabControl1.SelectedIndexChanged, Sub() UpdateFormula()
  End Sub

  '選択されている CheckBox を集計して Label に表示する処理
  Private Sub UpdateFormula()
    Dim values = checked.Where(Function(o) o.Parent Is TabControl1.SelectedTab).Select(Function(o) o.Tag).ToArray()
    Dim total As Integer = values.Cast(Of Integer)().Sum()
    If total > 2000 Then
      Label1.Text = "2000を超えました"
    ElseIf total > 1000 Then
      Label1.Text = "1000を超えました"
    Else
      Label1.Text = "1000を超えていません"
    End If
    If values.Length = 0 Then
      Label2.Text = ""
    ElseIf values.Length = 1 Then
      Label2.Text = total.ToString("N0")
    Else
      Label2.Text = String.Join("+", values.Select(Function(v) String.Format("{0:N0}", v))) & "=" & total.ToString("N0")
    End If
  End Sub

End Class
引用返信 編集キー/
■89126 / inTopicNo.19)  Re[15]: チェックボックスを使った計算
□投稿者/ 魔界の仮面弁士 (1919回)-(2018/10/31(Wed) 23:09:01)
No89122 (魔界の仮面弁士) に追記
> '別のタブが選択された場合も、Label の表示は切り替わる
> AddHandler TabControl1.SelectedIndexChanged, Sub() UpdateFormula()

ここまでの例では AddHandler を用いて、Load イベント内で動的にイベントハンドラを割り当てていますが、
慣れていなければ AddHandler は用いず、Handles 句による通常のイベント割り当て構文を利用しても構いません。


つまり上記の AddHandler の代わりに、こういうコードを使うという事です。

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
  UpdateFormula()
End Sub



そしてこれは、CheckBox に対しても言えます。

Load イベントにて、.Controls.OfType(Of ) で列挙して AddHandler していくのも、
あらかじめ事前に Handles 句で割り当てておくのも、最終的には同じ結果が得られます。


Public Class Form1

  Private checked As New List(Of CheckBox)()

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CheckBox1.Tag = 100
    CheckBox2.Tag = 200
    CheckBox3.Tag = 300
    CheckBox4.Tag = 400
    CheckBox5.Tag = 500
    CheckBox6.Tag = 200
    CheckBox7.Tag = 400
    CheckBox8.Tag = 600
    CheckBox9.Tag = 800
      :
      :
    CheckBox500.Tag = 1000
  End Sub

  Private Sub CheckBoxes_CheckedChanged(sender As CheckBox, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged, ……, CheckBox500.CheckedChanged
    If sender.Checked Then
      checked.Add(sender)
    Else
      checked.Remove(sender)
    End If
    UpdateFormula()
  End Sub

  Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
    UpdateFormula()
  End Sub

  Private Sub UpdateFormula()
    Dim values = checked.Where(Function(o) o.Parent Is TabControl1.SelectedTab).Select(Function(o) o.Tag).ToArray()
    Dim total As Integer = values.Cast(Of Integer)().Sum()
    If total > 2000 Then
      Label1.Text = "2000を超えました"
    ElseIf total > 1000 Then
      Label1.Text = "1000を超えました"
    Else
      Label1.Text = "1000を超えていません"
    End If
    If values.Length = 0 Then
      Label2.Text = ""
    ElseIf values.Length = 1 Then
      Label2.Text = total.ToString("N0")
    Else
      Label2.Text = String.Join("+", values.Select(Function(v) String.Format("{0:N0}", v))) & "=" & total.ToString("N0")
    End If
  End Sub
End Class
引用返信 編集キー/
■89127 / inTopicNo.20)  Re[16]: チェックボックスを使った計算
 
□投稿者/ コジコジ (10回)-(2018/11/01(Thu) 03:29:25)
魔界の仮面弁士様

そのまま実践していて寝てしまいました・・・。

詳しくありがとうございます。
感謝いたします。

案2 による実装例にて試してました。
TabPageごとにて正しく計算されました。

TabPageを切り替えるとLabel2が消えてしまいます。
どのタブに移行をしてもLabel1も同様に計算がそのまま出来るようにしたいです。

こちらの仕様もお伝えしていなく申し訳ありません。

何卒よろしくお願いいたします。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -