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

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

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

日付とイベントのデータグリッドビューへの表示について

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

■93493 / inTopicNo.1)  日付とイベントのデータグリッドビューへの表示について
  
□投稿者/ mookko (1回)-(2019/12/15(Sun) 13:39:03)

分類:[C#] 

2019/12/15(Sun) 13:47:59 編集(投稿者)
はじめまして。
C#を独学ではじめたばかりのビギナーです、初歩的な質問で申し訳ございませんがよろしくお願いいたします。

ビジュアルスタジオでアプリを作成しています。
目標はボタンをクリックしたら、データグリッドビュー内の表に

ーーーーーーーーーーーーー
ボタン

日付 起動時間 終了時間
12/1 09:00   18;00
.       .          .
.       .          .
.       .          .
12/31 09:00      18;00

ーーーーーーーーーーーーー

のように現在の月とマシンの起動と終了時間を表示してくれる、勤怠アプリのようなものが作りたいです。
現在の月の取得をデータグリッドビューへの表示、起動と終了の時間のイベントの取得(日付に基づくものではなく、該当のイベントをふるい順に全て)まではできたのですが、目標のように起動と終了の時間を2、3列目に表示ができず、取得したい日付の部分のみの表示ができていません。

日付はこのような感じで取得して
DateTime dt = DateTime.Now;
            int iDays = DateTime.DaysInMonth(dt.Year, dt.Month);
            for (int i = 1; i <= iDays; i++)
            { dataGridView1.Rows.Addで先に行を追加しています。

セルの指定や行を追加して1列目にすべてを列挙するところまではできたのですが、カラムでの指定ができない?ため困っています。
よろしくお願いします。

引用返信 編集キー/
■93495 / inTopicNo.2)  Re[1]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ WebSurfer (1991回)-(2019/12/15(Sun) 14:35:07)
No93493 (mookko さん) に返信

開発環境(OS, .NET, Visua Studionのバージョンなど)を書いてください。それから、全体的に
どのような構成なのかも書いてください。

DataGridView を使った Windows Forms アプリと言うと、以下のような構成を考えるのですが、質
問者さんのアプリの現状が違うのであれば、以下の構成にするよう考え直しませんか?

データソース ⇔ DataSet / DataTable ⇔ BindingSource ⇔ DataGridView

データソースには SQL Server, Access, Excel, CSV, XML などを利用できます。データソースの中
に DataGridView に表示したい勤怠情報を入れておけばやりたいことは容易にできるのではないかと
思います。
引用返信 編集キー/
■93496 / inTopicNo.3)  Re[1]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ WebSurfer (1992回)-(2019/12/15(Sun) 14:43:26)
No93493 (mookko さん) に返信

【追記】

データソースに SQL Server とか Access を使う場合は Visual Studio のデータソース構成ウィザ
ードを使うと非常に簡単に、自力では一行もコードを書かずにアプリが作れると思います。

その他のデータソースの場合も表示するだけなら難しくはないです。XML の場合の例を紹介しておき
ます。

XML ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2019/04/26/show-content-of-xml-file-on-datagridview.aspx
引用返信 編集キー/
■93498 / inTopicNo.4)  Re[2]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ mookko (3回)-(2019/12/15(Sun) 18:55:15)
No93496 (WebSurfer さん) に返信

早速のメッセージありがとうございます。
ビジュアルスタジオのバージョンは2017で、OSはWindows10です。

あくまでデータセットやテーブルを使わないと表示ができないのでしょうか?
試してみたのですがそれでもなお現在の月に限定したイベントが取得できません、、、
表示したいデータはコード内ですべて取得したいです。
引用返信 編集キー/
■93501 / inTopicNo.5)  Re[3]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ WebSurfer (1993回)-(2019/12/15(Sun) 21:55:09)
No93498 (mookko さん) に返信

> あくまでデータセットやテーブルを使わないと表示ができないのでしょうか?

カタカナを使うのは止めましょう。コンパイルエラーです。

DataSet / DataTable()である必要はなく List<T> 型のオブジェクトでもいいです。
直接 DataGridView にデータを代入するよりも、DataTable などを作ってそれをデータ
バインドする方が簡単なはずということです。

> 試してみたのですがそれでもなお現在の月に限定したイベントが取得できません、、、

どのようにしたのかコードをアップするなどして具体的に説明してください。
引用返信 編集キー/
■93524 / inTopicNo.6)  Re[4]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ mookko (4回)-(2019/12/17(Tue) 21:49:46)
No93501 (WebSurfer さん) に返信
> どのようにしたのかコードをアップするなどして具体的に説明してください。
リストにしたところ、目的の列にデータが表示できました。ありがとうございます。
今は日付と関連できておらず、取得したデータがそのまま表示されてしまいます。日付に対応したイベントを行に追加したいです。例:12月5日の行に5日の起動と終了の時間がはいる(休日などでデータがない場合は日付のみで時間は空欄)
DateTimeなどはどこにいれて関連付けるのがよいのでしょうか?
以下コードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

private void button1_Click(object sender, EventArgs e)
{
List<string> datelist = new List<string>();
DateTime dt = DateTime.Now;
int iDays = DateTime.DaysInMonth(dt.Year, dt.Month);
for (int i = 1; i <= iDays; i++)
{
datelist.Add(new DateTime(dt.Year, dt.Month,i).ToString("d"));
}

List<string> timelist1 = new List<string>();
List<string> timelist2 = new List<string>();
System.Diagnostics.EventLog[] logs = System.Diagnostics.EventLog.GetEventLogs();
foreach (System.Diagnostics.EventLog log in logs)
{
if (log.Log == "System")
{
for (int i = log.Entries.Count - 1; i > 0; i--)
{
if (log.Entries[i].Source == "MicroSoft - Windows - Kernel- General")
{
if (log.Entries[i].InstanceId == 12)
{
timelist1.Add(log.Entries[i].TimeGenerated.ToString("[HH;mm;ss]"));
}
else if (log.Entries[i].InstanceId == 13)
{
timelist2.Add(log.Entries[i].TimeGenerated.ToString("[HH;mm;ss]"));
}
}
}
}
}
for (int i = 1; i < iDays; i++)
{
dataGridView1.Rows.Add();
}
for (int i = 0; i < datelist.Count; i++)
{
dataGridView1[0, i].Value = datelist[i];
}
for (int i = 0; i < timelist1.Count; i++)
{
dataGridView1[1, i].Value = timelist1[i];
}
for (int i = 0; i < timelist2.Count; i++)
{
dataGridView1[2, i].Value = timelist2[i];
}

}
}
}

引用返信 編集キー/
■93525 / inTopicNo.7)  Re[5]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ WebSurfer (1995回)-(2019/12/17(Tue) 22:24:46)
No93524 (mookko さん) に返信

コードを図表モードでアップし直してください。インデントされてないコードは
質問者さん自身も読む気がしないのでは?
引用返信 編集キー/
■93526 / inTopicNo.8)  Re[6]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ mookko (6回)-(2019/12/17(Tue) 23:39:22)
No93525 (WebSurfer さん) に返信
> ■No93524 (mookko さん) に返信
> 
> コードを図表モードでアップし直してください。インデントされてないコードは
> 質問者さん自身も読む気がしないのでは?

このようなモードがあったのですね
教えていただきありがとうございます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            List<string> datelist = new List<string>();
            DateTime dt = DateTime.Now;
            int iDays = DateTime.DaysInMonth(dt.Year, dt.Month);
            for (int i = 1; i <= iDays; i++)
            {
                datelist.Add(new DateTime(dt.Year, dt.Month,i).ToString("d"));
            }

            List<string> timelist1 = new List<string>();
            List<string> timelist2 = new List<string>();
            System.Diagnostics.EventLog[] logs = System.Diagnostics.EventLog.GetEventLogs();
            foreach (System.Diagnostics.EventLog log in logs)
            {
                if (log.Log == "System")
                {
                    for (int i = log.Entries.Count - 1; i > 0; i--)
                    {
                        if (log.Entries[i].Source == "MicroSoft - Windows - Kernel- General")
                        {
                            if (log.Entries[i].InstanceId == 12)
                            {
                                timelist1.Add(log.Entries[i].TimeGenerated.ToString("[HH;mm;ss]"));
                            }
                            else if (log.Entries[i].InstanceId == 13)
                            {
                                timelist2.Add(log.Entries[i].TimeGenerated.ToString("[HH;mm;ss]"));
                            }
                        }
                    }
                }
            }
            for (int i = 1; i < iDays; i++)
            {
                dataGridView1.Rows.Add();
            }
            for (int i = 0; i < datelist.Count; i++)
            {
                dataGridView1[0, i].Value = datelist[i];
            }
            for (int i = 0; i < timelist1.Count; i++)
            {
                dataGridView1[1, i].Value = timelist1[i];
            }
            for (int i = 0; i < timelist2.Count; i++)
            {
                dataGridView1[2, i].Value = timelist2[i];
            }

        }
    }
}

引用返信 編集キー/
■93529 / inTopicNo.9)  Re[5]: 日付とイベントのデータグリッドビューへの表示について
□投稿者/ WebSurfer (1996回)-(2019/12/18(Wed) 11:00:24)
No93524 (mookko さん) に返信

> リストにしたところ、目的の列にデータが表示できました。ありがとうございます。

List<string> 型のリストを 3 つ作って日付、開始時刻、終了時刻を取得し、それをそれぞれ 
DataGridView の 1 〜 3 列に表示するように考えたと理解しています。

しかし、私がレスした List<T> を使うというのはそういう意味ではないです。

T というのはクラスで、例えば以下のようなクラスを定義します。

public class Record
{
    public string Date { get; set; }
    public string Start { set; get; }
    public string End { set; get; }
}

Record の Date に日付、Start に開始時刻、End に終了時刻を設定し、List<Record> 型のオブ
ジェクトに Add していきます。以下のような感じです(イベントログから開始時刻と終了時刻
を取得するとことは簡略化しました)。

protected List<Record> GetRecords()
{
    List<Record> records = new List<Record>();
    DateTime dt = DateTime.Now;
    int iDays = DateTime.DaysInMonth(dt.Year, dt.Month);
    for (int i = 1; i <= iDays; i++)
    {
        records.Add(new Record
        {
            Date = new DateTime(dt.Year, dt.Month, i).ToString("d"),
            Start = "08:00:00",
            End = "17:00:00"
        });
    }
    return records;
}

それを BindingSource 経由で DataGirdView にデータバインドします。全体的には以下のよう
になります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        private DataGridView dataGridView1;
        private BindingSource bindingSource1;

        public Form1()
        {
            InitializeComponent();

            this.dataGridView1 = new DataGridView();
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.bindingSource1 = new BindingSource();
            this.dataGridView1.DataSource = this.bindingSource1;
            this.Controls.Add(this.dataGridView1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.bindingSource1.DataSource = GetRecords();
        }

        protected List<Record> GetRecords()
        {
            List<Record> records = new List<Record>();
            DateTime dt = DateTime.Now;
            int iDays = DateTime.DaysInMonth(dt.Year, dt.Month);
            for (int i = 1; i <= iDays; i++)
            {
                records.Add(new Record
                {
                    Date = new DateTime(dt.Year, dt.Month, i).ToString("d"),
                    Start = "08:00:00",
                    End = "17:00:00"
                });
            }
            return records;
        }        
    }

    public class Record
    {
        public string Date { get; set; }
        public string Start { set; get; }
        public string End { set; get; }
    }
}

上のコードでは Form.Load イベントでデータバインドしてますが、そこは質問者さんのやりた
いこと(Button クリックで表示?)に合わせて適宜変更してください。

後は全て DataGridView がやってくれます。結果は以下の画像のようになります。

http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f12%2f1218result.jpg

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ