// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; namespace System.Windows.Forms; public partial class DataGridViewComboBoxEditingControl : ComboBox, IDataGridViewEditingControl { private DataGridView? _dataGridView; private bool _valueChanged; private int _rowIndex; public DataGridViewComboBoxEditingControl() : base() { TabStop = false; } protected override AccessibleObject CreateAccessibilityInstance() { DataGridViewComboBoxEditingControlAccessibleObject controlAccessibleObject = new(this); _dataGridView?.SetAccessibleObjectParent(controlAccessibleObject); return controlAccessibleObject; } public virtual DataGridView? EditingControlDataGridView { get { return _dataGridView; } set { _dataGridView = value; } } [AllowNull] public virtual object EditingControlFormattedValue { get => GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting); set { if (value is string valueStr) { Text = valueStr; if (string.Compare(valueStr, Text, true, CultureInfo.CurrentCulture) != 0) { SelectedIndex = -1; } } } } public virtual int EditingControlRowIndex { get => _rowIndex; set => _rowIndex = value; } public virtual bool EditingControlValueChanged { get => _valueChanged; set => _valueChanged = value; } public virtual Cursor EditingPanelCursor => Cursors.Default; public virtual bool RepositionEditingControlOnValueChange => false; public virtual void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { Font = dataGridViewCellStyle.Font; if (dataGridViewCellStyle.BackColor.A < 255) { // Our ComboBox does not support transparent back colors Color opaqueBackColor = Color.FromArgb(255, dataGridViewCellStyle.BackColor); BackColor = opaqueBackColor; _dataGridView!.EditingPanel.BackColor = opaqueBackColor; } else { BackColor = dataGridViewCellStyle.BackColor; } ForeColor = dataGridViewCellStyle.ForeColor; } public virtual bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) { var maskedKeyData = keyData & Keys.KeyCode; if (maskedKeyData == Keys.Down || maskedKeyData == Keys.Up || (DroppedDown && (maskedKeyData == Keys.Escape)) || maskedKeyData == Keys.Enter) { return true; } return !dataGridViewWantsInputKey; } public virtual object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) => Text; public virtual void PrepareEditingControlForEdit(bool selectAll) { if (selectAll) { SelectAll(); } } private void NotifyDataGridViewOfValueChange() { _valueChanged = true; _dataGridView!.NotifyCurrentCellDirty(true); } protected override void OnSelectedIndexChanged(EventArgs e) { base.OnSelectedIndexChanged(e); if (SelectedIndex != -1) { NotifyDataGridViewOfValueChange(); } } internal override void ReleaseUiaProvider(HWND handle) { if (TryGetAccessibilityObject(out AccessibleObject? accessibleObject)) { ((DataGridViewComboBoxEditingControlAccessibleObject)accessibleObject).ClearParent(); } base.ReleaseUiaProvider(handle); } }