Расположение стола и управление перемещением / скрытием - PullRequest
0 голосов
/ 20 июля 2011

У меня есть форма, в которой есть элемент управления макетом таблицы. Макет таблицы состоит из 3 столбцов и ряда строк.

Первый столбец содержит метку, второй - текстовое поле, поле со списком или указатель даты и времени. Третий столбец содержит изображение, которое включается или выключается, если введенная пользователем информация содержит ошибки. Это позволит им увидеть, какие поля они заполнили неправильно или пропустили.

Пятая строка содержит поле со списком, в котором пользователь может выбрать тип транзакции, которую он вводит. В зависимости от того, что пользователь выбирает, элементы управления могут быть переупорядочены.

Позвольте мне показать пример с использованием скриншотов:

http://i.stack.imgur.com/OZmFH.png

Это стандартная версия запущенной формы, пользователь не выбрал тип транзакции.

Теперь предположим, что пользователь выбирает платеж по кредиту. Форма будет переоформлена, чтобы показать следующее:

http://i.stack.imgur.com/j76wG.png

Вы можете видеть, что повествование и брутто сдвинулись на пару строк, и было показано новое окно, позволяющее пользователю выбрать ссуду и количество осуществляемых платежей.

В зависимости от выбранного типа транзакции могут быть представлены 3 различных макета.

Сейчас я делаю это, проверяя событие SelectedIndexChanged в поле типа транзакции comboBox и вызываю метод для настройки представления.

Каков наилучший способ достичь этого? Сейчас у меня есть код, который делает это, но он невероятно грязный.

Должен ли я взглянуть на что-то другое, кроме панели макета таблицы?

    readonly TableLayoutPanelCellPosition tlCCccLbl = new TableLayoutPanelCellPosition(0, 5);
    readonly TableLayoutPanelCellPosition tlCCccList = new TableLayoutPanelCellPosition(1, 5);
    readonly TableLayoutPanelCellPosition tlCCccError = new TableLayoutPanelCellPosition(2, 5);

    readonly TableLayoutPanelCellPosition tlCCnarrativeLbl = new TableLayoutPanelCellPosition(0, 6);
    readonly TableLayoutPanelCellPosition tlCCnarrativeTxt = new TableLayoutPanelCellPosition(1, 6);

    readonly TableLayoutPanelCellPosition tlCCgrossLbl = new TableLayoutPanelCellPosition(0, 7);
    readonly TableLayoutPanelCellPosition tlCCgrossTxt = new TableLayoutPanelCellPosition(1, 7);
    readonly TableLayoutPanelCellPosition tlCCgrossError = new TableLayoutPanelCellPosition(2, 7);

    readonly TableLayoutPanelCellPosition tlStdnarrativeLbl = new TableLayoutPanelCellPosition(0, 5);
    readonly TableLayoutPanelCellPosition tlStdnarrativeTxt = new TableLayoutPanelCellPosition(1, 5);

    readonly TableLayoutPanelCellPosition tlStdgrossLbl = new TableLayoutPanelCellPosition(0, 6);
    readonly TableLayoutPanelCellPosition tlStdgrossTxt = new TableLayoutPanelCellPosition(1, 6);
    readonly TableLayoutPanelCellPosition tlStdgrossError = new TableLayoutPanelCellPosition(2, 6);

    readonly TableLayoutPanelCellPosition tlStdLoanPymntsLbl = new TableLayoutPanelCellPosition(0, 8);
    readonly TableLayoutPanelCellPosition tlStdLoanPymntsCmb = new TableLayoutPanelCellPosition(1, 8);
    readonly TableLayoutPanelCellPosition tlStdLoanPymntsError = new TableLayoutPanelCellPosition(2, 8);

    readonly TableLayoutPanelCellPosition tlStdLoanLbl = new TableLayoutPanelCellPosition(0, 9);
    readonly TableLayoutPanelCellPosition tlStdLoanError = new TableLayoutPanelCellPosition(2, 9);
    readonly TableLayoutPanelCellPosition tlStdccLbl = new TableLayoutPanelCellPosition(0, 10);
    readonly TableLayoutPanelCellPosition tlStdccList = new TableLayoutPanelCellPosition(1, 10);
    readonly TableLayoutPanelCellPosition tlStdccError = new TableLayoutPanelCellPosition(2, 10);

    readonly TableLayoutPanelCellPosition tlLnLoanLbl = new TableLayoutPanelCellPosition(0, 5);
    readonly TableLayoutPanelCellPosition tlLnLoanCmb = new TableLayoutPanelCellPosition(1, 5);
    readonly TableLayoutPanelCellPosition tlLnLoanError = new TableLayoutPanelCellPosition(2, 5);

    readonly TableLayoutPanelCellPosition tlLnLoanPymntsLbl = new TableLayoutPanelCellPosition(0, 6);
    readonly TableLayoutPanelCellPosition tlLnLoanPymntsCmb = new TableLayoutPanelCellPosition(1, 6);
    readonly TableLayoutPanelCellPosition tlLnLoanPymntsError = new TableLayoutPanelCellPosition(2, 6);

    readonly TableLayoutPanelCellPosition tlLnnarrativeLbl = new TableLayoutPanelCellPosition(0, 7);
    readonly TableLayoutPanelCellPosition tlLnnarrativeTxt = new TableLayoutPanelCellPosition(1, 7);

    readonly TableLayoutPanelCellPosition tlLngrossLbl = new TableLayoutPanelCellPosition(0, 8);
    readonly TableLayoutPanelCellPosition tlLngrossTxt = new TableLayoutPanelCellPosition(1, 8);
    readonly TableLayoutPanelCellPosition tlLngrossError = new TableLayoutPanelCellPosition(2, 8);

    private void cmbTransactionType_SelectedIndexChanged(object sender, EventArgs e)
    {
        ToggleLoanControls(false);
        ToggleCreditCardControls(false);
        ToggleReceiptNumbers();

        if (clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.LoanPayments || clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.HpPayment)
             ToggleLoanControls(true);
        else if(clsTransactionTypes.TransactionStringToTransactionID(cmbTransactionType.Text) == clsTransactionTypes.TransferToCreditCardCard)
            ToggleCreditCardControls(true);

        SetupViews(cmbTransactionType.Text);
    }

    private void SetupViews(string transactionTypeSelected)
    {
         if (transactionTypeSelected == "Payment to Credit Card")
            SetupCreditCardsLayouts();
        else if(transactionTypeSelected == "HP Payment" || transactionTypeSelected == "Loan Payment")
            SetupLoanLayouts();
        else
            SetupStandardLayouts();
    }

    private void SetupLoanLayouts()
    {
        tableBank1Income.SetCellPosition(panelLoans, tlLnLoanCmb);
        tableBank1Income.SetCellPosition(lblLoans, tlLnLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlLnLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlLnLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlLnLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlLnLoanPymntsError);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlLngrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlLngrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlLngrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlLnnarrativeTxt);
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlLnnarrativeLbl);

        tableBank1Income.SetCellPosition(panelCreditCards, tlStdccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlStdccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlStdccError);

    }

    private void SetupStandardLayouts()
    {
        tableBank1Income.SetCellPosition(txtTransactionGross, tlStdgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlStdgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlStdgrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlStdnarrativeTxt);
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlStdnarrativeLbl);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlStdgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlStdgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlStdgrossError);

        tableBank1Income.SetCellPosition(panelLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlStdLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlStdLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlStdLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlStdLoanPymntsError);

        tableBank1Income.SetCellPosition(panelCreditCards, tlStdccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlStdccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlStdccError);

        lblCCError.Visible = false;
        lblErrorLoanName.Visible = false;
        lblErrorLoanPayments.Visible = false;
    }

    private void SetupCreditCardsLayouts()
    {
        tableBank1Income.SetCellPosition(panelCreditCards, tlCCccList);
        tableBank1Income.SetCellPosition(lblCreditCard, tlCCccLbl);
        tableBank1Income.SetCellPosition(lblCCError, tlCCccError);

        tableBank1Income.SetCellPosition(txtTransactionGross, tlCCgrossTxt);
        tableBank1Income.SetCellPosition(lblTransactionAmount, tlCCgrossLbl);
        tableBank1Income.SetCellPosition(lblErrorTransactionGross, tlCCgrossError);

        tableBank1Income.SetCellPosition(txtTransactionNarrative, tlCCnarrativeTxt);  
        tableBank1Income.SetCellPosition(lblTransactionNarrative, tlCCnarrativeLbl);

        tableBank1Income.SetCellPosition(panelLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblLoans, tlStdLoanLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanName, tlStdLoanError);

        tableBank1Income.SetCellPosition(cmbNumberOfLoanPayments, tlStdLoanPymntsCmb);
        tableBank1Income.SetCellPosition(lblLoanPayments, tlStdLoanPymntsLbl);
        tableBank1Income.SetCellPosition(lblErrorLoanPayments, tlStdLoanPymntsError);

     }

Код работает, перемещая ненужные элементы управления внизу таблицы и перемещая необходимые элементы вверх. Таким образом, в таблице нет пробелов. например Я не хотел бы просто включать и выключать видимость комбинированного списка Loan, потому что тогда будет разрыв между типом транзакции и описанием двух строк. Я всегда хочу, чтобы это было максимально компактно.

Единственная проблема с текущей системой - это пустые строки внизу, содержащие невидимые элементы управления. Также сложно добавлять строки, так как мне нужно пойти и изменить весь код, который связан с перемещением вещей.

Спасибо за чтение, если вы зайдете так далеко.

есть> фу

Спасибо

Методы управления переключениями не перечислены. Они в основном включают / выключают элементы управления, которые не нуждаются в видимости.

1 Ответ

1 голос
/ 20 июля 2011

Иногда я нахожусь в подобных ситуациях и предпочитаю менее грязный подход:

  1. Прежде всего, ваш скриншот, кажется, указывает, что одного столбца будет достаточно, так как ширина первого столбца уже «фиксирована» с длинной меткой «Transaction Amount (Gross)». Поэтому удалите один столбец.
  2. Поместите каждую пару Label / TextBox в свою (обычную) панель. Итак, одна панель на ряд. (Поскольку ширина левого «столбца» фиксирована, вы можете сделать все панели одинаковой ширины и убедиться, что текстовые поля совпадают.)
  3. Добавление всех панелей в панель TableLayout.
  4. Установите высоту всех строк TableLayoutPanel в «автоматический размер». Установите AutoSize = true и AutoSizeMode = GrowAndShrink для TableLayoutPanel.

Чтобы настроить макет вашей формы, вам теперь нужно только установить свойство Visible 9 панелей. Если панель будет скрыта, вся строка макета таблицы исчезнет из-за строк автоматического изменения размера, а остальные строки переместятся вверх. То же самое, если вы создадите новую строку. Таким образом, макет автоматизирован, вам нужно только решить, какую строку показывать.

Кроме того, TableLayoutPanel теперь будет сокращаться до своего содержимого. Если хотите, теперь вы можете также возиться со свойствами AutoSize * содержащейся формы, чтобы придать форме автоматический размер, но будьте осторожны, чтобы не раздражать пользователей таким поведением. Вы также можете обработать событие SizeChanged TableLayoutPanel, чтобы настроить размер вашей формы по мере необходимости.

Я надеюсь, что мое описание понятно, в противном случае не стесняйтесь спрашивать подробности.

...