1

私はそのような小さなポップアップウィンドウを持っています:

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

namespace SQLProcWriter
{
    public partial class Progress : Form
    {
        public Progress()
        {
            InitializeComponent();
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;
        }
    }
}

namespace SQLProcWriter
{
    partial class Progress
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Progress));
            this.progressBar1 = new System.Windows.Forms.ProgressBar();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // progressBar1
            // 
            resources.ApplyResources(this.progressBar1, "progressBar1");
            this.progressBar1.Name = "progressBar1";
            this.progressBar1.UseWaitCursor = true;
            // 
            // label1
            // 
            resources.ApplyResources(this.label1, "label1");
            this.label1.Name = "label1";
            this.label1.UseWaitCursor = true;
            // 
            // Progress
            // 
            resources.ApplyResources(this, "$this");
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.label1);
            this.Controls.Add(this.progressBar1);
            this.Name = "Progress";
            this.UseWaitCursor = true;
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        public System.Windows.Forms.ProgressBar progressBar1;
        public System.Windows.Forms.Label label1;
    }
}

ロードして処理しているファイルの進行状況を表示することになっています。問題は、ファイルの処理が終了するまでプログレスバーまたはラベルが表示されないことです。フォームはメインウィンドウのloadメソッドで作成され、openfiledialogが「OK」の結果で完了すると表示されます。何か助けはありますか?

編集:値を設定するためのコードは非常に広範囲にわたるので、私はもともとそれを削除することを選択しましたが、ここにあります:

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

namespace SQLProcWriter
{
    public partial class Form1 : Form
    {
        private string Script { get; set; }
        private List<string> File { get; set; }
        private List<string> CreateStatements { get; set; }
        private List<Table> Tables { get; set; }
        private List<string> FieldBuffer { get; set; }
        private Progress progressWindow;
        private int progressValue;

        private const string CREATE_SEPARATOR = "create table ";
        private string[] FIELD_SEPARATOR = new string[] { @"\t", @" "};

        public Form1()
        {
            InitializeComponent();
            File = new List<string>();
            FieldBuffer = new List<string>();
            Tables = new List<Table>();
            CreateStatements = new List<string>();
            progressValue = 0;
            progressWindow = new Progress();
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            About about = new About();
            about.Show();
        }

        private void Convert()
        {
            bool adding = false, nullableBuffer = false;
            string buffer = "", buffer2 = "";
            Table currentTable = new Table();
            currentTable.ForeignKeys = new List<ForeignKey>();
            currentTable.Columns = new List<Column>();
            int startIndex = 0, endIndex = 0;
            int linesDone = 0;
            int totalLines = File.Count();
            progressWindow.label1.Text = "Reading \'Create\' Statements";

            foreach (string s in File)
            {
                //Extract column names
                if (adding)
                {
                    if (s.Contains(@")") && s.Length == 1)
                    {
                        adding = false;
                        Tables.Add(currentTable);
                        currentTable = new Table();
                        currentTable.Columns = new List<Column>();
                        currentTable.ForeignKeys = new List<ForeignKey>();
                        currentTable.TableName = "";
                        currentTable.PrimaryKey = new PrimaryKey();
                    }
                    else
                    {
                        if (s != @"(")
                        {
                            if (s != "\t")
                            {
                                if (s.Contains("constraint"))
                                {
                                    //Constraint rules here
                                    if (s.Contains("primary key clustered"))
                                    {
                                        startIndex = s.IndexOf("(");
                                        startIndex++;
                                        endIndex = s.IndexOf(")");

                                        buffer = s.Substring(startIndex, (endIndex - startIndex));


                                        currentTable.PrimaryKey = new PrimaryKey(buffer, "int");
                                    }
                                    else if (s.Contains("foreign key"))
                                    {
                                        startIndex = s.IndexOf("(");
                                        startIndex++;
                                        endIndex = s.IndexOf(")");
                                        buffer = s.Substring(startIndex, (endIndex - startIndex));

                                        startIndex = s.IndexOf("references ");
                                        startIndex += 11;
                                        endIndex = s.Length;

                                        buffer2 = s.Substring(startIndex, (endIndex - startIndex));
                                        endIndex = buffer2.IndexOf(String.Format("({0}", buffer));
                                        buffer2 = buffer2.Substring(0, endIndex);


                                        currentTable.ForeignKeys.Add(new ForeignKey(buffer, buffer2));
                                    }
                                }
                                else
                                {
                                    //Regular table field
                                    buffer = s.Substring(s.IndexOf("\t") + 1, s.IndexOf(" "));

                                    startIndex = s.IndexOf(" ");
                                    startIndex++;
                                    endIndex = s.IndexOf(",");

                                    buffer2 = s.Substring(startIndex, (endIndex - startIndex));

                                    if (buffer2.Contains("not null"))
                                    {
                                        nullableBuffer = false;
                                        buffer2 = buffer2.Remove(buffer2.IndexOf(" "));
                                    }
                                    else
                                        nullableBuffer = true;

                                    currentTable.Columns.Add(new Column(buffer, buffer2, nullableBuffer));
                                }
                            }
                        }
                    }
                }

                //Extract Table Names
                if (s.Contains(CREATE_SEPARATOR))
                {
                    adding = true;
                    buffer = s;
                    currentTable.TableName = buffer.Remove(0, 13);
                }

                linesDone++;
                progressValue = (((linesDone / totalLines) * 100) / 4) + 25;
                progressWindow.progressBar1.Value = progressValue;
            }

            ProcessForeignKeys();
            ProcessPrimaryKeys();
            Tables = Utils.TrimEverything(Tables);
        }

        private void ProcessForeignKeys()
        {
            int keysDone = 0;
            int totalKeys = 0;
            progressWindow.label1.Text = "Processing Foreign Keys";

            foreach (Table t in Tables)
                foreach (ForeignKey fk in t.ForeignKeys)
                    totalKeys++;

            foreach (Table t in Tables)
                foreach (ForeignKey fk in t.ForeignKeys)
                {
                    for (int i = 0; i < t.Columns.Count; i++)
                        if (t.Columns[i].Name.Contains(fk.Name))
                        {
                            fk.DataType = t.Columns[i].DataType;
                            t.Columns.RemoveAt(i);
                        }

                    keysDone++;
                    progressValue = (((keysDone / totalKeys) * 100) / 4) + 50;
                }
        }

        private void ProcessPrimaryKeys()
        {
            int primaryKeys = 0;
            int totalKeys = Tables.Count();
            progressWindow.label1.Text = "Processing Primary Keys";

            foreach (Table t in Tables)
            {
                for (int i = 0; i < t.Columns.Count; i++)
                {
                    if (t.Columns[i].DataType.Contains("identity"))
                    {
                        t.Columns.RemoveAt(i);
                        primaryKeys++;
                        progressValue = (((primaryKeys / totalKeys) * 100) / 4) + 75;
                        progressWindow.progressBar1.Value = progressValue;
                    }
                }
            }

            progressWindow.label1.Text = "Done!";
            progressWindow.Hide();
            progressWindow.progressBar1.Value = 0;
            progressWindow.label1.Text = "";
            progressValue = 0;
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OutputTextBox.Text = "";
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = Environment.SpecialFolder.MyDocuments.ToString();
            ofd.Filter = "SQL Script File (.sql)|*.sql";
            ofd.Multiselect = false;
            ofd.Title = "Select an SQL Script File";

            Stream fileStream = null;

            int currentLine = 0;
            int totalLines = 0;

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                progressWindow.Show();

                if ((fileStream = ofd.OpenFile()) != null)
                {
                    TextReader tr = new StreamReader(fileStream);
                    string line;
                    totalLines = System.IO.File.ReadLines(ofd.FileName).Count();

                    while ((line = tr.ReadLine()) != null)
                    {
                        File.Add(line);
                        OutputTextBox.Text += line + "\r\n";

                        currentLine++;
                        progressValue = (int)(((currentLine / totalLines) * 100) / 4);
                        progressWindow.progressBar1.Value = progressValue;
                    }

                    Convert();
                }
            }
        }

        private void CancelButton_Click(object sender, EventArgs e)
        {
            Script = string.Empty;
            OutputTextBox.Text = string.Empty;
        }

        private void quitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ConvertButton_Click(object sender, EventArgs e)
        {
            List<string> Output = new List<string>();
            progressWindow.Show();
            progressWindow.label1.Text = "Creating SQL";
            int total = Tables.Count();
            int done = 0;

            Output.Add(String.Format("--Auto-generated code (c) {0} Logic & Design", System.DateTime.Now.Year));

            foreach (Table t in Tables)
            {
                //Add a comment
                Output.Add(String.Format("--Procs for {0}", t.TableName));

                #region List
                Output.Add(String.Format("create proc {0}_List", t.TableName));
                Output.Add("as");
                Output.Add(String.Format("\tselect * from {0}", t.TableName));
                #endregion

                #region Get
                Output.Add(String.Format("create proc {0}_Get", t.TableName));
                Output.Add(String.Format("@{0} {1}", t.PrimaryKey.Name, t.PrimaryKey.DataType));
                Output.Add("as");
                Output.Add(String.Format("\tif"));
                #endregion

                #region Create
                #endregion

                #region Update
                #endregion

                #region Delete
                #endregion

                done++;
                progressValue = (done / total) * 100;
                progressWindow.progressBar1.Value = progressValue;
            }
        }
    }
}
4

2 に答える 2

1

ファイルを非同期で開くことをお勧めします。たぶんBeginOpenFileまたは同様のものを呼び出し、完了関数に進行状況バーを100または99パーセントに更新させてから、Form.Invokeなどを介して閉じます。一方、進行状況フォーム内にタイマーを設定して、指定されたミリ秒数、たとえば100ミリ秒に1回10%の進行状況を進めます。ただし、90%に達した後は、進捗状況を設定させないでください。ファイルを開くのにどれくらいの時間がかかるかはわかりません。見積もりしかできません。そのため、どのアプリケーションのプログレスバーも正確ではない傾向があります。

注:タイマーの解像度が1秒(1000ms)より小さくできるかどうかわからない...

C#での非同期操作について学ぶ必要がある場合は、「C#経由のCLR」が適しています。その本を手に入れることができない場合は、「非同期IO操作.NETの実行」をグーグルで調べて、たとえばFile.BeginReadのコード例を調べてください。

そして、Form.Invokeを忘れないでください。

于 2012-10-10T15:44:34.990 に答える
0

Control.Invokeは、コントロールのウィンドウハンドルを所有するスレッドで指定されたデリゲートを実行するため、次のコマンドを呼び出すだけで済みます。

//Indicate that the process has started
        Invoke(ShowStatusDelegate, this.toolStripStatusLabelSpinner, true, this.toolStripStatusLabelText, "In progress...", btnGo, false);

アクションがスレッド化または処理されていると仮定します。

于 2012-10-10T15:27:38.963 に答える