2

コンボ ボックスで選択したインデックスに基づいて、いくつかのユーザー コントロールの 1 つを表示するフォームに取り組んでいます。フォームは、さまざまなデータ フィールドを含むさまざまな種類の項目 (つまり、サービス、在庫、非在庫など) を追加および編集するために使用されます。ユーザー コントロールは、Linq-to-SQL オブジェクトを永続化する前に、フォーム上のいくつかのコントロールにアクセスする必要があります。

私が遭遇した問題は、 の値がUserControl.ParentForm常に null を返すことです。理想的には、コントロールがフォームに密接に結合されるべきではないことを理解していますが、リファクタリング オプションを検討する前に、なぜこれが起こっているのかを理解したいと思います。

以下では、ユーザー コントロールを追加するフォームにメソッドを含め、ParentForm を取得しようとするコントロールにメソッドを含めました。ParentForm が NULL である理由について誰かが提案してくれますか?

フォームコード:

void comboBoxEditType_SelectedIndexChanged(object sender, EventArgs e)
{
    string value = comboBoxEditType.SelectedItem.ToString();

    if (value == "DiscountItem")
    {
        if (itemControl != null)
            this.Controls.Remove(itemControl);

        labelControlDescriptionOfType.Text = "Use to subtract a percentage or fixed amount from a total or subtotal. "
                                           + "Do not use this item type for an early payment discount.";

        DiscountItemControl control = new DiscountItemControl();
        control.Location = new Point(13, 110);
        this.Controls.Add(control);
        itemControl = control;
    }
    else if (value == "InventoryItem")
    {
        if (itemControl != null)
            this.Controls.Remove(itemControl);

        labelControlDescriptionOfType.Text = "Use for goods you purchase, track as inventory, and resell.";

        InventoryItemControl control = new InventoryItemControl();
        control.Location = new Point(13, 110);
        this.Controls.Add(control);
        itemControl = control;
    }
    else if (value == "NonInventoryItem")
    {
        if (itemControl != null)
            this.Controls.Remove(itemControl);

        labelControlDescriptionOfType.Text = "Use for goods you buy but don't track, like office supplies, "
                                           + "or materials for a specific job that you charge back to the customer.";

        NonInventoryPartItemControl control = new NonInventoryPartItemControl();
        control.Location = new Point(13, 110);
        this.Controls.Add(control);
        itemControl = control;
    }
    else if (value == "OtherChargeItem")
    {
        if (itemControl != null)
            this.Controls.Remove(itemControl);

        labelControlDescriptionOfType.Text = "Use for miscellaneous labor, material, or part charges, such as delivery charges, "
                                           + "setup fees, and service charges.";

        OtherChargeItemControl control = new OtherChargeItemControl();
        control.Location = new Point(13, 110);
        this.Controls.Add(control);
        itemControl = control;
    }
    else if (value == "ServiceItem")
    {
        if (itemControl != null)
            this.Controls.Remove(itemControl);

        labelControlDescriptionOfType.Text = "Use for services you charge for or purchase, like specialized labor, consulting hours, or "
                                           + "professional fees.";

        ServiceItemControl control = new ServiceItemControl();
        control.Location = new Point(13, 110);
        this.Controls.Add(control);
        itemControl = control;
    }

    // Move the location of buttons
    int btnX = 12 + itemControl.Width + 10;
    btnSaveAndClose.Location = new Point(btnX, btnSaveAndClose.Location.Y);
    btnSaveAndNew.Location = new Point(btnX, btnSaveAndNew.Location.Y);
    btnCancel.Location = new Point(btnX, btnCancel.Location.Y);

    // Center the Make Inactive CheckBox on side of UserControl
    Point point = new Point();
    point.X = btnCancel.Location.X;
    point.Y = itemControl.Location.Y + itemControl.Size.Height / 2;
    checkEditMakeInactive.Location = point;

    // Resize the window to fit fit the control
    int windowWidth = 140 + itemControl.Width;
    int windowHeight = 150 + itemControl.Height;
    this.Size = new Size(windowWidth,windowHeight);

    // Resize the group containing information on the item type
    int groupWidth = itemControl.Width;
    int groupHeight = groupControlType.Height;
    groupControlType.Size = new Size(groupWidth, groupHeight);
    //this.groupControlType.Size

    // Resize the label
    int labelWidth = itemControl.Width - 27 - comboBoxEditType.Size.Width;
    labelControlDescriptionOfType.Size = new Size(labelWidth, labelControlDescriptionOfType.Height);
}

ParentForm を取得しようとするユーザー コントロール コード (常に NULL が返される)

private void CopyItemDataFromForm()
{
    currentDiscountItem.Name = textEditItemName_Number.Text;
    if (checkEditSubItemOf.Checked)
    {
        currentDiscountItem.fkParentItem = ComboBoxHelper.getItemFromComboBox(comboBoxEditParentItem);
    }
    currentDiscountItem.SalesDescription = memoEditDescription.Text;
    currentDiscountItem.SalesPrice = Convert.ToDecimal(textEditAmountOrPercent.Text);
    currentDiscountItem.fkIncomeAccount = ComboBoxHelper.getQBLookUpFromComboBox(comboBoxEditAccount);
    currentDiscountItem.fkTaxCode = ComboBoxHelper.getQBLookUpFromComboBox(comboBoxEditTaxCode);


    AddEditItemForm form = this.ParentForm as AddEditItemForm;
    currentDiscountItem.IsActive = !(form.GetMakeInactiveCheckboxValue());
}
4

1 に答える 1

0

オブジェクト ツリーでこの FrameworkElement の親オブジェクトを取得します。

var result = this.Parent;
于 2012-08-25T19:31:44.513 に答える