0

これにはいろいろと困ります。私は大規模なプロジェクトに取り組んでいるので、興味があり、取り組んでいるクラスはわずかしかありません。基本的に、これらはフォームです。1 つはユーザーが詳細を編集するメイン エディターで、もう 1 つはピン番号を割り当てるために使用されます。ユーザーがピンを持っている場合、メイン エディター フォームで、ユーザーはこのピンを編集することを選択できます。ここに問題があります。ピンを編集する場合、コードで行っていることは、古いピンを削除して新しいピンを追加することです。ただし、エディタ フォームが閉じられるまで、データベースは更新されません。したがって、可能であれば、OKButton のクリックでデータベースを変更するメソッドを呼び出したいと思います。私が直面している問題は、方法がわからないことです。

DB コードは次のとおりです。このクラスは DetailsConn と呼ばれます。

public string editPin(int driverID)
{
        if (SchemaChecker.PINAvailable())
        {
            string sql = "EditPIN";
            using (SqlCommand cmd = new SqlCommand(sql, base.connection))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Remove("@nDriverID");
                cmd.Parameters.AddWithValue("@nDriverID", driverID);
                cmd.Parameters.Remove("@nPIN");
                SqlParameter pinParameter = cmd.Parameters.Add("@nPIN", SqlDbType.Char);
                pinParameter.Direction = ParameterDirection.Output;
                pinParameter.Size = 32;

                cmd.ExecuteNonQuery();

                return pinParameter.Value.ToString();
            }
        }

        return "";
}

私の編集のコードは次のとおりです。

private void editToolStripMenuItem_Click(object sender, EventArgs e)
{
        if (this.listViewDriverTags.SelectedItems.Count > 0)
        {
            ListViewItem lvi = this.listViewDriverTags.SelectedItems[0];

            DriverTag driverTag = lvi.Tag as DriverTag;

            else if (blahTag.blahType == 2)
            {
                buttonAssignPIN_Click(sender, e);
            }

            //message stuff and dialog boxes with localization info
            if (dr == DialogResult.Yes)
            {
                this.listViewDriverTags.Items.Remove(lvi);
                if (Tag.id != -1)
                {
                    TagsToBeDeleted.Add(driverTag);
                }
            }

            if (dr == DialogResult.No)
            {
                this.listViewTags.Items.Clear();
                this.listViewTags.Items.Add(lvi);
            }
        }
    }

これが私のbuttonAssignPINのものです:

private void buttonAssignPIN_Click(object sender, EventArgs e)
{
        using (AssignPINForm form = new AssignPINForm())
        {
            if (form.ShowDialog(this) == DialogResult.OK)
            {
                DriverTag PIN = DriverTag.GetNewPIN(form.DriverTag);

                ListViewItem lvi = this.listViewTags.Items.Add(PIN.driverTag);
                lvi.SubItems.Add(this.TagTypes[PIN.TagType]);
                lvi.Tag = PIN;
            }
        }
 }

最後に、私の AssignPINForm コードは次のとおりです。

public partial class AssignPINForm : Form
{
    public AssignPINForm()
    {
        InitializeComponent();

        this.buttonOK.Click += new EventHandler(buttonOK_Click);
        this.buttonCancel.Click += new EventHandler(buttonCancel_Click);
        this.buttonOK.Enabled = false;
        this.textBoxPin.TextChanged += delegate(object sender, EventArgs e)
        {
            String pattern = @"^[0-9]{4,20}$";
            Regex regex = new Regex(pattern);
            buttonOK.Enabled = regex.IsMatch(textBoxPin.Text);
        };

        LoadStrings();
    }

    public void LoadStrings()
    {
       //stome stuff
    }

    public string DriverTag
    {
        get { return this.textBoxPin.Text; }
        set { this.textBoxPin.Text = value; }
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
    }

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

    private void AssignPINForm_Load(object sender, EventArgs e)
    {
    }
}

いたるところにあることは知っていますが、関連すると思われるものはすべて提供しました。真ん中の 2 つのスニペットも同じクラスにあり、DB のものは同じソリューションですが、別のプロジェクトです。誰かが私が何を求めているのかを解読して助けてくれるとありがたいです。

ありがとう!

4

2 に答える 2

0

実際、それが正しく機能したとしても、問題は解決しないことがわかりました。新しいプロシージャを呼び出して、データベース スキーマでそれを宣言する必要がありました。基本的には、私が信用していたよりもはるかに複雑でした。それにもかかわらず、応答をありがとう。

于 2013-07-08T07:35:53.730 に答える
0

私はあなたが何を求めているのか完全にはわかりません.これはベストプラクティスではないというコメントのいくつかに同意しますが、あなたが求めているのは、buttonOK_Clickメソッドを次のようなものに更新することだと思います:

private void buttonOK_Click(object sender, EventArgs e)
{
    using(DetailsConn connection = new DetailsConn())
    {
        int driver = -1;

        if(int.TryParse(this.DriverTag, out driver)) {
            connection.editPin(driver);
        }
    }
}

また、editPin() 関数への他の可能性のある参照を削除することもできます。

于 2013-07-04T21:23:10.113 に答える