Datagridview копировать и вставлять в выпадающий список - PullRequest
0 голосов
/ 16 ноября 2011

Я работаю над элементом управления сеткой данных.Я добавил в него столбец со списком и заполнил его из таблицы данных как;

DataTable datatable1 = new DataTable();   
datatable1.Columns.Add("DisplayMember");   
datatable1.Columns.Add("ValueMember");   

//*** For loop to load datatable1 with values ***   

combobox1.DataSource = datatable1;   
combobox1.DisplayMember = "DisplayMember";   
combobox1.ValueMember = "ValueMember";  

Теперь, когда данные заполнены, я пытаюсь выбрать запись из столбца комбинированного списка и использую Копировать / Вставить как Ctrl + C и Ctrl + V. Но это выдает ошибку как

Вставленные вами данные имеют неправильный формат для ячейки.

Я мог бы выяснить, что это из-за свойств DisplayMember и ValueMember.Но я не могу удалить это также.
Если я установлю DisplayMember и ValueMember на одно и то же значение, то оно будет работать нормально.Но я должен оставить эти поля разными.
Кто-нибудь знает, как решить эту ошибку?

Заранее спасибо
Виджай

Ответы [ 2 ]

0 голосов
/ 21 декабря 2012

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

Пример:

if (oCell is DataGridViewComboBoxCell)
{
    DataGridViewComboBoxCell tmp = oCell as DataGridViewComboBoxCell;
    if (tmp.Items.Contains(sCells[i]))
    {
        tmp.Value = tmp.Items[tmp.Items.IndexOf(sCells[i])];
    }
}
0 голосов
/ 16 ноября 2011

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

void Ctrl_KeyDown(object sender, KeyEventArgs e)
{
    if ((e.Control && e.KeyCode == Keys.V) || (e.Shift && e.KeyCode == Keys.Insert))
    {
        e.SuppressKeyPress = e.Handled = EditAppend(ClipboardAsDataRow);
    }
}


public bool EditAppend(IEnumerable<DataRow> rows)
{
    try
    {
        // whatever is your datasourse... 
        DataTable dt = new DataTable;
        foreach (DataRow row in rows)
        {
            dt.LoadDataRow(row.ItemArray, LoadOption.Upsert);
        }
        return true;    
    }
    catch ()
    {
        return false;
    }
}


/// <summary>
/// Get Clipboard as DataRows
/// </summary>
public IEnumerable<DataRow> ClipboardAsDataRow
{
get
    {
        DataTable dt = new DataTable();
        IDataObject iData = Clipboard.GetDataObject();
        if (iData == null || !iData.GetDataPresent(DataFormats.Text)) return dt.Rows.Cast<DataRow>();

        string table = (string)iData.GetData(DataFormats.Text);
        foreach (string row in value.Split("\n".ToCharArray()))
        {
            dt.LoadDataRow(row.Split("\r\x09".ToCharArray()), true);
        }
        return dt.Rows.Cast<DataRow>();
    } 
}
...