/// <summary>
        /// 列印點字。
        /// </summary>
        public void PrintBraille(bool toBrailler, bool toFile, string fileName)
        {
            if (toBrailler == false && toFile == false)
            {
                return;
            }

            string msg = "請按「確定」鈕開始列印點字。";

            if (toFile)
            {
                msg = "請按「確定」鈕開始將點字資料輸出至以下檔案:\r\n" + fileName;
            }
            if (MsgBoxHelper.ShowOkCancel(msg) != DialogResult.OK)
            {
                return;
            }

            bool cancel = false;

            // 起始列印工作
            BeginPrintBraille(ref cancel);
            if (cancel)
            {
                return;
            }

            StringBuilder brailleData = GenerateOutputData();

            if (toBrailler)
            {
                WriteToBrailler(brailleData);   // 輸出至點字印表機
            }
            if (toFile)
            {
                WriteToFile(brailleData, fileName); // 輸出至檔案
            }

            // 收尾列印工作
            EndPrintBraille(toBrailler, toFile);
        }
        internal void DeleteLine(int row, int col, bool needConfirm)
        {
            // 防錯:如果不是有效的儲存格位置就直接返回。
            if (!CheckCellPosition(row, col))
            {
                return;
            }

            // 選取欲刪除的列,讓使用者容易知道。
            SourceGrid.Position activePos = brGrid.Selection.ActivePosition;
            GridSelectRow(row, true);

            if (needConfirm && MsgBoxHelper.ShowOkCancel("確定要刪除整列?") != DialogResult.OK)
            {
                GridSelectRow(row, false);
                GridFocusCell(activePos, true);
                return;
            }

            row = GetBrailleRowIndex(row);  // 確保列索引為點字列。

            int         lineIdx = GetBrailleLineIndex(row);
            BrailleLine brLine  = m_BrDoc.Lines[lineIdx];

            brLine.Clear();
            brLine = null;
            m_BrDoc.Lines.RemoveAt(lineIdx);

            OnDataChanged();

            // 更新 UI。
            brGrid.Rows.RemoveRange(row, 3);

            RefreshRowNumbers();

            GridSelectRow(row, false);
            GridFocusCell(activePos, true);
        }