0

私はvb6のバックグラウンドから来て、c#の水域をゆっくりとテストしています。私の問題は、vb6 でのコーディングに使用する方法でプログラムをパターン化する傾向があるため、プログラムでオブジェクト指向アプローチを適応させるのが難しいことです。たとえば、私が作成しているソフトウェアのこのデータ入力部分を見てみましょう.

namespace WLMS
{
public partial class frmBA : Form
{
    enum status
    {
        add,
        edit,
        delete,
        complete,
        datafill,
    }

    status stat;
    clsSqlCommands sqlCommands = new clsSqlCommands();
    string connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
    int dataID = 0;


    public frmBA()
    {
        InitializeComponent();

    }

    private void displayInGrid()
    { 
        DataTable dt = new DataTable();
        dt = sqlCommands.dataFill("select series,baName,baLoc from tblBA order by baName",connectionString);
        if (dt != null)
        {
            dgBA_List.DataSource = dt;
            dgBA_List.Columns[0].HeaderText = null;
            dgBA_List.Columns[1].HeaderText = "BA NAME";
            dgBA_List.Columns[2].HeaderText = "BA LOCATION";
            dgBA_List.Columns[0].Visible = false;
            dgBA_List.Columns[1].Width = 100;
            dgBA_List.Columns[2].Width = 200;
            dataID = 0;        
        }
    }

    private void frmBA_Load(object sender, EventArgs e)
    {
        displayInGrid();
    }

    private void tlADD_Click(object sender, EventArgs e)
    {
        groupBox1.Enabled = true;
        clearTextBoxes(groupBox1);
        txtBAName.Focus();
        stat = status.add;
    }

    private void tlEDIT_Click(object sender, EventArgs e)
    {
        if (dataID != 0)
        {
            groupBox1.Enabled = true;
            stat = status.edit;
        }
        else
            MessageBox.Show("click on item to edit");
    }


    private void tlDELETE_Click(object sender, EventArgs e)
    {
        deleteData();
    }

    private void tlSAVE_Click(object sender, EventArgs e)
    {
        if (checkFilledTextBoxes(groupBox1) == true)
        {
            switch (stat)
            {
                case status.add:
                {
                    addNewData();
                    break;
                }
                case status.edit:
                {
                    editData();
                    break;
                }
                default:
                {
                    break;
                }
            }
        }

    }

    private bool checkForDuplicates()
    {
        DataRow dtr = sqlCommands.getOneRow("select count(*) as cnt from tblba where baName = '" + txtBAName.Text + "' and baLoc = '" + txtBALoc.Text + "'", connectionString);
        if (Convert.ToInt16(dtr["cnt"]) < 1)
        {
            return false;
        }
        else
            return true;
    }

    private void editData()
    {
        if (!checkForDuplicates())
        {
            sqlCommands.dataManipulate("update tblBa set baName = '" + txtBAName.Text + "',baLoc =  '" + txtBALoc.Text + "' where series = " + dataID + "", connectionString);
            clearTextBoxes(groupBox1);
            groupBox1.Enabled = false;
            stat = status.complete;
            displayInGrid();
            MessageBox.Show("Record Edited");
        }
        else
            MessageBox.Show("Duplicate record");
    }

    private void deleteData()
    {
        DialogResult dialogResult = MessageBox.Show("Are you sure?", "", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            sqlCommands.dataManipulate("delete from tblBa where series = " + dataID + "", connectionString);
            clearTextBoxes(groupBox1);
            groupBox1.Enabled = false;
            stat = status.complete;
            displayInGrid();
            MessageBox.Show("Record deleted");
        }
        else
            MessageBox.Show("Duplicate record");
    }

    private void addNewData()
    {
        if (!checkForDuplicates())
        {
            sqlCommands.dataManipulate("insert into tblBa (baName,baLoc) values ('" + txtBAName.Text + "','" + txtBALoc.Text + "')", connectionString);
            clearTextBoxes(groupBox1);
            txtBAName.Focus();
            stat = status.complete;
            displayInGrid();

            MessageBox.Show("Record Added");
        }
        else
            MessageBox.Show("Duplicate record");
    }

    private void clearTextBoxes(GroupBox gprx)
    {
        foreach (TextBox txtBx in gprx.Controls.OfType<TextBox>())
        {
            txtBx.Text = "";
        }
    }

    private Boolean checkFilledTextBoxes(GroupBox gprx)
    {
        foreach (TextBox txtBx in gprx.Controls.OfType<TextBox>())
        {
            if (txtBx.Text == "")
                return false;
        }
        return true;
    }

    private void tlEXIT_Click(object sender, EventArgs e)
    {
        this.Dispose();
    }

    private void dgBA_List_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        int rowIndex = e.RowIndex;
        DataGridViewRow row = dgBA_List.Rows[rowIndex];
        dataID = Convert.ToInt16(row.Cells[0].Value);
        txtBALoc.Text = row.Cells[1].Value.ToString();
        txtBAName.Text = row.Cells[2].Value.ToString();
        groupBox1.Enabled = false;
    }
}
}

グループボックス内に2つのテキストボックス、1つのデータグリッドビュー、および追加、編集、削除、保存、および終了する5つのツールストリップボタンがあります。私の質問は、オブジェクト指向のアプローチを持つようにコードを再構築するにはどうすればよいですか?

助けてください..ありがとう

4

2 に答える 2

2

GUIを使用しているので、MVCパターン(Winforms)を少し読むことをお勧めします。C#またはMVVMパターン(WPF) MVVM用のクリーンなWinForms MVCチュートリアルを探しています:最初から最後までのチュートリアル?

また、まともなデザインパターンの本を読むことをお勧めします。私が最初に始めたときに非常に便利だと思ったのは、Head FirstDesignPatternsの本でした。フォローするのはとても簡単です。彼らが使用する言語はJavaですが、これは構文的にC#に非常に近いものです。

たぶん、GUIアーキテクチャに関するこの優れたMartin Fowlerの記事も読んでください:http://martinfowler.com/eaaDev/uiArchs.html

編集:デニスのコメントに続く。Winform開発のMVPパターンもご覧ください。そのパターンを実装するいくつかの異なる方法:http://martinfowler.com/eaaDev/SupervisingPresenter.htmlおよびhttp://martinfowler.com/eaaDev/PassiveScreen.html

于 2012-06-17T12:12:51.000 に答える
0

簡単な答え - できません。

技術次第。

  • ASP.NET - MVC を使用すると、自然です。
  • WPF: まあ、とにかく UI は XAML です。Winforms: できません。制御はデザイナーで行われ、データのバインドはあまり良くありません。

WInForms でできる最善の方法は、実際にはロジックをフォームではなく別のオブジェクトに保持することですが、フォームは設計者が望む方法で行われます。そうしないと、すべての互換性が失われます。

于 2012-06-17T13:18:40.583 に答える