質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1689閲覧

【C#】ユーザーコントロールのラベルの背景色を条件に応じて変化させるプログラムを作成したい。

AAAAAAAAAAAAAA

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2023/03/03 06:10

編集2023/03/03 08:23

実現したいこと

C#でソフト内のAPIから情報を取得し、その情報を条件に当てはめてユーザーコントロールのラベルの背景色を変化させるプログラムを作成したい。

前提

・言語:C#
・OS:Windows 10
・開発環境:visual studio 2022(.NET framework4.8)

ソフト内のAPIから情報を取得し、その情報を条件に当てはめてユーザーコントロールのラベルの背景色を変化させるプログラムを作成しようとしています。

前回の質問で、条件によってラベルの背景色を変えるプログラムを作成することができましたが、
条件式の部分を上手く書くことができずに悩んでいます。

試したこと

現在は以下のようにプログラムを書いています。

【メインのcsファイル】

string Device = A.DeviceId;

上記のコードでAPIからデバイス名が取得できていることは確認しています。

【UserControl.xaml】

<Label x:Name="ラベル名_lb" Content="ラベルに表示する文字" HorizontalAlignment="Left" Margin="500,120,0,0" VerticalAlignment="Top" Height="26" FontSize="10" Background=LabelColor/>

上記のコードはユーザーコントロールに作成したラベルです。
【UserControl.xaml.cs】

switch (Device) { case "debaisu": ラベル名_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FFF39915"); break; default: ラベル名_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FF24E827"); break; }

上記コードはメインのcsファイルで取得したデバイス名が仮に「debaisu」と一致すればラベルの背景色が#FFF39915に、一致しなければ#FF24E827になるようにしたものです。

ここで、Deviceという名前は存在しませんというエラーが出てしまいます。
メインのcsファイルとUserControl.xaml.csの連携ができていないものと思いますが、
どのように記述すればよいのかわからないので教えていただけると助かります。
よろしくお願いいたします。

TN8001😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/03/03 08:37 編集

いろいろ不明点が多すぎて回答困難です。 メインというのはどういったクラスなんでしょうか? UserControlはどこに配置されているのでしょうか? switch文があるメソッドはどこから呼ばれるのでしょうか? switch文があるメソッドに引数は追加できるのでしょうか? UserControlのDataContextはどうなっているのでしょうか? 等々 エスパー回答するならUserControlにx:Nameを付けて、 userControl.ラベル名_lb.Background... とメイン側で変える。 詳細が分かればより良い提案をできると思いますが...
AAAAAAAAAAAAAA

2023/03/05 23:49

申し訳ありません。プログラミングを初めて数日なのでクラスとかメソッドとかDataContextとかは何なのかがよくわかってないです。 メインのcsファイルというのはvisual studioで新しいプロジェクトの作成をして出てきたファイルです。 そこにAPIから情報を取得するコマンドを書いています。 ユーザーコントロールは項目を追加で出てきたものをそのまま使用しています。 本プログラムはとあるソフト内のスクリプト機能で使用するために作成しており、 現在はAPIからの情報の取得とユーザーコントロールへの表示だけできている状態です。 後はif文かswitch文で状況を判断して問題があるのかないのかを色分けで表示できるようにしたいと考えています。 いただいた回答をもとに少し頑張ってみます。
TN8001

2023/03/06 03:00

> 申し訳ありません。プログラミングを初めて数日なのでクラスとかメソッドとかDataContextとかは何なのかがよくわかってないです。 最初はみんなわからないのですから謝る必要はありません。 しかし何がわからないかが伝わらなくては回答者も困ります。 > メインのcsファイルというのはvisual studioで新しいプロジェクトの作成をして出てきたファイルです。 これは「WPF アプリ(.NET Framework)」テンプレートで作ったプロジェクトなんですね? つまりメインとは「class MainWindow : Window { }」ということですか? 関連するコードはクラスやメソッドを含んだ状態で提示いただくと伝わりやすいです。 例えば「string Device = A.DeviceId;」だけでは、ローカル変数かフィールド(インスタンス変数)かすらわかりません。 > 本プログラムはとあるソフト内のスクリプト機能で使用するために作成しており、 > 現在はAPIからの情報の取得とユーザーコントロールへの表示だけできている状態です。 何かのソフトに組み込まれて動くプラグインというわけではなく、これは単体のEXEなんですね? (何かわかりませんが取得部分は問題なく動いているので)一般的なWPFアプリの質問と考えていいわけですね? だったとして「いろいろな変更パターン例」を回答しました^^
guest

回答1

0

ベストアンサー

ScriptUserControl1を作っているなら、そこで直接変えられます(エスパー回答通り)
もしかしたらUserControl1内で、Aを使えるのかもしれません(A次第)

グリッド直置きはよくないですが、変更点が多いと混乱させそうなので目をつぶります^^;

cs:Script.cs

1using System; 2using System.Linq; 3using System.Text; 4using System.Windows; 5using System.Windows.Controls; 6using System.Collections.Generic; 7using System.Reflection; 8using System.Runtime.CompilerServices; 9using System.Windows.Media; 10using ●●●●●●●●●●●●●●●●; 11using ●●●●●●●●●●●●●●●●; 12 13namespace ●●●●●●● 14{ 15 public class Script 16 { 17 public Script() 18 { 19 } 20 21 [MethodImpl(MethodImplOptions.NoInlining)] 22 public void Execute(●〇〇〇〇〇〇●〇〇〇 〇〇〇〇〇〇, System.Windows.Window window) 23 { 24 var control = new UserControl1(); 25 window.Content = control; 26 window.Height = 842; 27 window.Width = 595; 28 29 string DeviceID = A.DeviceId; 30 control.DeviceID_tb.Text = DeviceID; 31 32 switch (DeviceID) 33 { 34 case "debaisu": 35 // エスパー回答するならUserControlにx:Nameを付けて、userControl.ラベル名_lb.Background...とメイン側で変える。 36 control.DeviceOk_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FFF39915"); 37 control.DeviceOk_lb.Content = "OK"; 38 39 // OK・NG 2択で色も共通ならTriggerで色を切り替えるStyleを作っておくと、Contentを変えるだけで色も変わって楽 40 control.DeviceOk_lb2.Content = "OK"; 41 break; 42 default: 43 control.DeviceOk_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FF24E827"); 44 control.DeviceOk_lb.Content = "NG"; 45 46 control.DeviceOk_lb2.Content = "NG"; 47 break; 48 } 49 } 50 } 51}

xml:UserControl1.xaml

1<UserControl 2 x:Class="●●●●●●●.UserControl1" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:●●●●●●●" 7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 8 d:DesignHeight="450" 9 d:DesignWidth="800" 10 mc:Ignorable="d"> 11 <UserControl.Resources> 12 13 <!-- ContentがOKだったらBackgroundがオレンジ OK以外だったら緑になるLabelのStyle --> 14 <Style x:Key="OkNgLabelStyle" TargetType="{x:Type Label}"> 15 <!-- 基本的には緑 --> 16 <Setter Property="Background" Value="#FF24E827" /> 17 <Style.Triggers> 18 <!-- ContentがOKだったら... --> 19 <Trigger Property="Content" Value="OK"> 20 <!-- 背景をオレンジに変える --> 21 <Setter Property="Background" Value="#FFF39915" /> 22 </Trigger> 23 </Style.Triggers> 24 </Style> 25 </UserControl.Resources> 26 27 <Grid> 28 <Label 29 x:Name="Device_lb" 30 Height="26" 31 Margin="30,150,0,0" 32 HorizontalAlignment="Left" 33 VerticalAlignment="Top" 34 Content="デバイス名" 35 FontSize="10" /> 36 37 <TextBlock 38 x:Name="DeviceID_tb" 39 Margin="160,150,0,0" 40 HorizontalAlignment="Left" 41 VerticalAlignment="Top" 42 Text="仮 DeviceID" 43 TextWrapping="Wrap" /> 44 45 <Label 46 x:Name="DeviceOk_lb" 47 Height="26" 48 Margin="300,150,0,0" 49 HorizontalAlignment="Left" 50 VerticalAlignment="Top" 51 Background="#FFF39915" 52 Content="仮 OK" 53 FontSize="10" /> 54 55 <Label 56 x:Name="DeviceOk_lb2" 57 Height="26" 58 Margin="360,150,0,0" 59 HorizontalAlignment="Left" 60 VerticalAlignment="Top" 61 Content="仮 OK" 62 FontSize="10" 63 Style="{StaticResource OkNgLabelStyle}" /> 64 </Grid> 65</UserControl>

cs:UserControl1.xaml.cs

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Navigation; 14using System.Windows.Shapes; 15 16namespace ●●●●●●● 17{ 18 /// <summary> 19 /// UserControl1.xaml の相互作用ロジック 20 /// </summary> 21 public partial class UserControl1 : UserControl 22 { 23 public UserControl1() 24 { 25 InitializeComponent(); 26 27 // もしかしたらここに書けるのかもしれない(A次第) 28 29 //string DeviceID = A.DeviceId; 30 //DeviceID_tb.Text = DeviceID; 31 32 //switch (DeviceID) 33 //{ 34 // case "debaisu": 35 // DeviceOk_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FFF39915"); 36 // DeviceOk_lb.Content = "OK"; 37 38 // DeviceOk_lb2.Content = "OK"; 39 // break; 40 // default: 41 // DeviceOk_lb.Background = (Brush)new BrushConverter().ConvertFrom("#FF24E827"); 42 // DeviceOk_lb.Content = "NG"; 43 44 // DeviceOk_lb2.Content = "NG"; 45 // break; 46 //} 47 } 48 } 49}

namespace(プロジェクト名)やx:Name等をそのまま公開するのは支障がある場合、新たなプロジェクトを作って当たり障りのない名前(hoge,fuga・foo,bar・aaa,bbb等)にしてください。
今のプロジェクトを編集して出すのは、編集忘れがあったり矛盾したりしてかえって混乱します。

投稿2023/03/06 02:58

編集2023/03/09 03:26
TN8001

総合スコア9315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/03/06 02:59

いろいろな方法を並列で並べたためわかりにくいかもしれませんが、(難しそうに見せて)けむに巻くような意図はありません。 わからない点はコメントいただければ説明させていただきます。 あるいはより具体的な状況がわかれば、特化した内容に変更します。 * ViewModelは使ってない * UserControlは実は2つある * DeviceIdだけじゃない * LabelのContentと連動する * 色変更の法則 等々
AAAAAAAAAAAAAA

2023/03/08 02:09

いろいろな方法を説明していただきありがとうございます。 いろいろとやってはみたのですが上手く走りませんでした。 現在の状況としては、 プロジェクトの作成時に発生するメインのcsファイルと、項目の追加で追加したユーザーコントロールが1つのみです。 現在存在するファイルは「メイン.cs」(一番初めに作成されるcsファイル)、「UserControl1.xaml」、「UserControl1.xaml.cs」の3つだけです。 つまりは、このスクリプトを走らせたときに出てくるウィンドウはユーザーコントロール1の1つだけであり、 メインのcs上に記述したコードでAPIから装置名などの情報を取得し、 ユーザーコントロール上にラベルとして、装置名が一致すれば緑色で「OK」違うならば赤色で「NG」のように表示できればと思っておりました。 このプログラムが動作すれば、デバイス名のみでなく様々な項目についてOKやNGの判定を自動的にしてわかりやすく表示させたいと考えております。 この状況に特化した内容にしていただけますと大変助かります。 こちらの状況がわからないところがあればまた追加させていただきます。 よろしくお願いいたします。
TN8001

2023/03/08 03:16

> プロジェクトの作成時に発生するメインのcsファイルと、項目の追加で追加したユーザーコントロールが1つのみです。 う~ん?またわからなくなってきました^^; EXEでなくDLLを作っているのか?? Visual Studioで「新しいプロジェクトの作成」したときのテンプレート名って何だったですか? [新しいプロジェクトを作成する - Visual Studio (Windows) | Microsoft Learn](https://learn.microsoft.com/ja-jp/visualstudio/ide/create-new-project) 回答で使ったのは「WPF アプリ(.NET Framework)」テンプレートです。 > メインのcs上に記述したコードでAPIから装置名などの情報を取得し、 > ユーザーコントロール上にラベルとして、装置名が一致すれば緑色で「OK」違うならば赤色で「NG」のように表示できればと思っておりました。 雰囲気はわかるのですが、「メイン.cs」と「UserControl1.xaml.cs」の関係がわかりません。 「メイン.cs」の内容を追記いただくか、「とあるソフト」を明かせますか?
AAAAAAAAAAAAAA

2023/03/08 09:37

説明できておらず申し訳ありませんが、ビルドするとexeではなくDLLが作成されます。 DLLをとあるソフト上で開いて実行するスクリプトを作成しようとしています。 実はvisual studioで「新しいプロジェクトの作成」とはやっておらず、 「とあるソフト」のスクリプト作成ウィザードを使用すると、 visual studio上でメインのcsファイルが表示される状態になります。 そこで生成されるコードは以下のようになります。 とあるソフトは明かせないので一部伏字になります。 using System; using System.Linq; using System.Text; using System.Windows; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using ●●●●●●●●●●●●●●●●; using ●●●●●●●●●●●●●●●●; namespace ●●●●●● { public class Script { public Script() { } [MethodImpl(MethodImplOptions.NoInlining)] public void Execute(●●●●●●●●●●●●●●●●) { // TODO : Add here the code. } } } お手数をおかけいたしますが、よろしくお願いいたします。
TN8001

2023/03/08 10:39 編集

> 説明できておらず申し訳ありませんが、ビルドするとexeではなくDLLが作成されます。 > 「とあるソフト」のスクリプト作成ウィザードを使用すると、 > visual studio上でメインのcsファイルが表示される状態になります。 なるほど。 > そこで生成されるコードは以下のようになります。 これだけでUserControl1が表示されるのですか? 「メイン.cs」の中にUserControl1という文字は一切出てきませんか? class Scriptは何も継承していないんでしょうか? デバイス名等を取得するAPIはExecuteの引数が必要な状態ですか?(↓のように小文字のhogeを使ってる) Execute(Hoge hoge) { string Device = hoge.なんたらかんたら Script←→UserControl1間のやり取り方がわかりませんねぇ(static変数なんかでごまかすことはできるかもしれませんが^^; ただこれができないわけがないので、なにか正式な方法があるはずです(WPFで作らせる以上UserControl1のDataContextをScriptから設定できそうに思うのですが... 質問へのコメント AAAAAAAAAAAAAA 2023/03/06 08:49 > 現在はAPIからの情報の取得とユーザーコントロールへの表示だけできている状態です。 これは「情報をラベルに表示ならできた」という意味ですよね? でも ScriptからUserControl1に情報を渡せたわけでもなく UserControl1内で情報を取得できたわけでもなく 「とあるソフト」の設定画面でラベル名を指定した みたいなことなんでしょうか?
AAAAAAAAAAAAAA

2023/03/09 00:51

上のコードはスクリプト作成ウィザードを使用した直後の状態でして、 その段階ではユーザーコントロールは存在していないのです。 そのあとに自分で項目の追加からユーザーコントロールを追加しています。 その後のコードは以下のようになります。 using System; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using ●●●●●●●●●●●●●●●●; using ●●●●●●●●●●●●●●●●; namespace ●●●●●●● { public class Script { public Script() { } [MethodImpl(MethodImplOptions.NoInlining)] public void Execute(●●●●●●●) { var control = new UserControl1(); window.Content = control; window.Height = 842; //window.SizeToContent = SizeToContent.Height; window.Width = 595; //window.SizeToContent =SizeToContent.Width; //control.context_gui= context; string DeviceID = A.DeviceId;   control.DeviceID_tb.Text = DeviceID; } } } Executeの部分はこんな感じで記載されています。 public void Execute(●〇〇〇〇〇〇●〇〇〇 〇〇〇〇〇〇, System.Windows.Window window) ●は大文字、〇は小文字です。hogeという文字はでてきてないです。 この状態でユーザーコントロールのxamlファイルに以下のように項目を作り <Label x:Name="●●●●_lb" Content="デバイス名" HorizontalAlignment="Left" Margin="30,150,0,0" VerticalAlignment="Top" Height="26" FontSize="10"/> その横に以下のようにテキストボックスでAPIから取得したデバイス名を表示しています。 <TextBlock x:Name="DeviceID_tb" HorizontalAlignment="Left" Margin="160,150,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/> 今回はその横にさらにOKかNGかを判断して色分けで表示するラベルを作成しようとしています。 以下のような感じです。 <Label x:Name="●●●●_lb" Content="OK" HorizontalAlignment="Left" Margin="300,150,0,0" VerticalAlignment="Top" Height="26" FontSize="10" Background="#FFF39915"/> (もしくは以下を表示する。) <Label x:Name="●●●●_lb" Content="NG" HorizontalAlignment="Left" Margin="300,150,0,0" VerticalAlignment="Top" Height="26" FontSize="10" Background="#FF24E827"/> 上記の2つのラベルの切り分けをif文がswich文で行おうと考えています。 説明がわかりずらく大変申し訳ありませんが、よろしくお願いいたします。
TN8001

2023/03/09 03:26

Windowが渡されてくるんですか! エスパー成功していたわけですねw > エスパー回答するならUserControlにx:Nameを付けて、userControl.ラベル名_lb.Background...とメイン側で変える。 というのは編集した回答のような意図で言ったのです(通じなかったわけですが^^; つまりお互い省略が多すぎると話が通じないということです。 > 上記の2つのラベルの切り分けをif文がswich文で行おうと考えています。 表示非表示を切り替えてもいいですが、回答は当初の通り色を変えました。 表示非表示を切り替えるなら。 control.ラベル名.Visibility = Visibility.Visible; // 表示 control.ラベル名.Visibility = Visibility.Hidden; // 非表示
AAAAAAAAAAAAAA

2023/03/10 06:16

コントロールに名前を付けて、 「control.」を頭につければいいだけだったのですね。 このやり方でメインのcsファイルにswich文を書いて、表示する文字列や背景色を切り替えることができました。 お手数をおかけしていまい申し訳ありません。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問