-1

RTL 言語のテキストにはこれが必要なため、RightToLeft プロパティを true (RightToLeft.Yes) に設定した WindowsForms アプリに DataGridView があります。一方、数値は左から右に記述する必要があります。

しかし、ご存知かもしれませんが、個々の列に対して RightToLeft の異なる値を設定することはできません。ほとんどのデータ アプリで使用されていると考えられているこのような重要なコントロールが、国際的な目的でこの基本機能をサポートしていないのはなぜでしょうか。これは必須です

とにかく、編集する列の名前/データタイプに基づいて、EditingControlShowing イベントで RightToLeft プロパティを変更しようとしています。

    private void grid1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        TextBox t = e.Control as TextBox; 
        if (t == null) return; //it is not a textbox editing column

        DataGridViewColumn col = grid1.Columns[grid1.CurrentCell.ColumnIndex];
        string columnName = col.Name;

        if (Utility.IsNumericType(col.ValueType) || columnName.Contains("تاریخ")) //render as left-to-right
            t.RightToLeft = RightToLeft.No; //setting RightToLeft property causes that cell values do not update after first cell edit!!!
        else
            t.RightToLeft = RightToLeft.Yes;

    }

しかし、これは期待どおりに機能しません。EditingControl の RightToLeft プロパティを設定すると、セルの値を編集しているときに、最初のセルの編集後に、変更するたびに次のセルの値が元の値に戻ります。

なぜこれが起こるのか理解できませんか?

4

3 に答える 3

0

以下を使用できます。

 this.dataGridView1.Columns["CustomerName"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
于 2015-03-30T06:38:00.483 に答える
0

回避策として、イベントで左から右方向にはCTRL+を送信し、右から左方向には + を送信します。Left-ShiftCTRLRight-ShiftEditingControlShowing

if (Utility.IsNumericType(column.ValueType) || IsDateColumn(columnName)) //render as left-to-right
    KeyboardUtility.KeyPressByHold(Keys.ControlKey, Keys.LShiftKey); //CTRL+LeftShift = Left-To-Right direction 
else //render as right-to-left
    KeyboardUtility.KeyPressByHold(Keys.ControlKey, Keys.RShiftKey); //CTRL+RightShift = Right-To-Left direction 

 --------------------------

    public static void KeyPressByHold(Keys holdKey, Keys pressKey)
    {
        KeyDown(holdKey); // => keybd_event(key, flag);
        KeyPress(pressKey);
        KeyUp(holdKey);
    }

    /// <param name="bVirtualKey">Virtual Keycode of keys. E.g. VK_RETURN, VK_TAB, … You may use Keys enumeration in .Net for this.</param>
    /// <param name="bScanCode">Scan Code value of the keys (scan code is a hardware dependent code based on the model of the keyboard). E.g. 0xb8 for “Left Alt” key.</param>
    /// <param name="dwFlags">Flag that is set for key state. E.g. KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY</param>
    /// <param name="dwExtraInfo">32-bit extra information about keystroke.</param>
    public static void keybd_event(Keys VirtualKey, KeyEventF dwFlags) // bool flagKeyUp, bool flagExtendedKey) //this version is more easy to call in .Net
    {
        uint ScanCode = MapVirtualKey((uint)VirtualKey, 0); // 0 = VirtualKey to ScanCode
        keybd_event((byte)VirtualKey, (byte)ScanCode, (uint)dwFlags, 0);
    }
于 2018-01-08T09:35:54.910 に答える