3

ユーザーがセルをクリックしてオンまたはオフ、黒または白にできる単純な 6X8 セル マトリックスを作成しようとしています。Windows フォーム コントロールを試し、データ グリッド コントロールを調べましたが、これまでのところ、Winforms ツール ボックスで何かを使用してマトリックスを作成する方法がわかりません。

テーブルを作成しましたが、各セルを個別にスタイリングする方法や、各セルに onclick イベントを使用する方法がわかりません。これは可能ですか、そうでない場合、これを行う別の方法はありますか?

4

4 に答える 4

2

WinFormsでDataGridViewコントロールを使用できると思います。必要な列数と行数を設定できます。たとえば、列の場合

m_Grid.ColumnCount = 5;

および行の場合

m_Grid.Rows.Add();

CellClick、CellDoumleClick、またはその他のイベントを処理し、そのフィールドでパラメーターDataGridViewCellEventArgsを使用できます。例えば、

m_Grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.Red;
于 2013-03-05T19:02:35.597 に答える
2

これは、実行時にラベルが作成されるソリューションです。「マトリックス」とボタンをホストするパネルが必要で、すべてデフォルト名が付いています。ボタンをクリックするとチェッカーボードが描画され、各セルをクリックすると色を反転できます。

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  const int RowCount = 6;
  const int ColumnCount = 8;
  private void button1_Click(System.Object sender, System.EventArgs e)
  {
    for (int i = 0; i < RowCount; i++)
    {
      for (int j = 0; j < ColumnCount; j++)
      {
        Label lbl = new Label();
        lbl.Size = new Size(20, 20);
        lbl.Location = new Point(i * 20, j * 20);
        lbl.BackColor = (i + j) % 2 == 0 ? Color.Black : Color.White;
        lbl.Click += lbl_Click;
        panel1.Controls.Add(lbl);
      }
    }

    MessageBox.Show(CountCellsOfColor(Color.Black).ToString());
  }

  private int CountCellsOfColor(Color color)
  {
    int count = 0;
    foreach (Label lbl in panel1.Controls.OfType<Label>())
    {                
      if (lbl.BackColor == color) count += 1;
    }
    return count;
  }

  private void lbl_Click(object sender, System.EventArgs e)
  {
    Label lbl = (Label)sender;
    Color color = lbl.BackColor;
    if (color == System.Drawing.Color.Black)
    {
      color = System.Drawing.Color.White;
    }
    else
    {
      color = System.Drawing.Color.Black;
    }
    lbl.BackColor = color;
  }   
}     

VB.NET バージョン (元のバージョン、後で C# に変換されましたが、必要な場合に備えて保持することにしました):

Option Strict On
Public Class Form1
  Const RowCount As Integer = 6
  Const ColumnCount As Integer = 8

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    For i = 0 To RowCount - 1
      For j = 0 To ColumnCount - 1
        Dim lbl As New Label
        lbl.Size = New Size(20, 20)
        lbl.Location = New Point(i * 20, j * 20)
        lbl.BackColor = If((i + j) Mod 2 = 0, Color.Black, Color.White)
        AddHandler lbl.Click, AddressOf lbl_Click
        Panel1.Controls.Add(lbl)
      Next
    Next

    MessageBox.Show(CountCellsOfColor(Color.Black))
  End Sub

  Private Function CountCellsOfColor(color As Color) As Integer
    Dim count As Integer = 0
    For Each lbl In Panel1.Controls.OfType(Of Label)()
      If lbl.BackColor = color Then count += 1
    Next
    Return count
  End Function

  Private Sub lbl_Click(sender As Object, e As System.EventArgs)
    Dim lbl As Label = CType(sender, Label)
    Dim color As Color = lbl.BackColor
    If color = Drawing.Color.Black Then
      color = Drawing.Color.White
    Else
      color = Drawing.Color.Black
    End If
    lbl.BackColor = color
  End Sub
End Class
于 2013-03-05T19:03:45.837 に答える
0

これに対する私のWPFアプローチは次のとおりです。

<Window x:Class="WpfApplication4.Window13"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window13" Height="300" Width="300">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="8" Columns="6" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <DataTemplate.Resources>
                    <Storyboard x:Key="ToBlack" TargetName="RctFill" Duration="00:00:00.5">
                        <ColorAnimation From="White" To="Black" Duration="00:00:00.5" Storyboard.TargetProperty="Color"/>
                    </Storyboard>
                    <Storyboard x:Key="ToWhite" TargetName="RctFill" Duration="00:00:00.5">
                        <ColorAnimation From="Black" To="White" Duration="00:00:00.5"  Storyboard.TargetProperty="Color"/>
                    </Storyboard>
                </DataTemplate.Resources>
                <Button Command="{Binding ToggleCommand}">
                    <Button.Template>
                        <ControlTemplate>
                            <Rectangle Stroke="Black" StrokeThickness="1" x:Name="Rct">
                                <Rectangle.Fill>
                                    <SolidColorBrush Color="White" x:Name="RctFill"/>
                                </Rectangle.Fill>
                            </Rectangle>
                            <ControlTemplate.Triggers>
                                <DataTrigger Binding="{Binding State}" Value="True">
                                    <DataTrigger.EnterActions>
                                        <BeginStoryboard Storyboard="{StaticResource ToBlack}"/>
                                    </DataTrigger.EnterActions>
                                    <DataTrigger.ExitActions>
                                        <BeginStoryboard Storyboard="{StaticResource ToWhite}"/>
                                    </DataTrigger.ExitActions>
                                </DataTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

コードビハインド:

using System;
using System.Linq;
using System.Windows;
using System.ComponentModel;

namespace WpfApplication4
{
    public partial class Window13 : Window
    {
        public Window13()
        {
            var rnd = new Random();
            InitializeComponent();
            DataContext = Enumerable.Range(0, 48).Select(x => new Square() {State = rnd.Next(0,5) > 3});
        }
    }

    public class Square:INotifyPropertyChanged
    {
        private bool _state;
        public bool State
        {
            get { return _state; }
            set
            {
                _state = value;
                NotifyPropertyChanged("State");
            }
        }

        private DelegateCommand _toggleCommand;
        public DelegateCommand ToggleCommand
        {
            get { return _toggleCommand ?? (_toggleCommand = new DelegateCommand(x => State = !State)); }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

WPFTutorial.NetのDelegateCommandを使用しています

私のコードをコピーして a に貼り付けてFile -> New Project -> WPF Application、結果を自分で確認してください。DelegateCommandリンク先の定義も必要です。

黒から白への遷移はアニメーション化されます。また、この例を拡張して他のプロパティをアニメーション化し、各セル内に必要な UI を配置することもできます。また、これは完全に解像度に依存せず、ウィンドウのサイズを変更するUniformGridと、すべてのグリッド セルのサイズも変更されることがわかります。

これを winforms アプリケーション内に配置する必要がある場合は、ElementHost

于 2013-03-05T19:11:29.787 に答える
0

ランタイムに配置された一連のラベルを使用することをお勧めします。

List<Label> lables=new List<Label>();



var a = new Label();
labels.Add(a);
//... set positions and sizes
a.AutoSize=False;

this.Controls.Add(a);

これにより、後でラベル配列の各ラベルにインデックスを付けて、行/列の配置に一致させることができます。

于 2013-03-05T18:42:30.087 に答える