Datagridview复制粘贴到组合框列上

本文关键字:组合 复制 Datagridview | 更新日期: 2023-09-27 18:14:52

我正在做一个datagridview控件。我已经添加了一个组合框列,并从一个数据表填充它;

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设置为相同的值,那么它工作得很好。但我必须保持这些字段不同。
有谁知道如何解决这个错误吗?

提前致谢
Vijay

Datagridview复制粘贴到组合框列上

我使用此代码粘贴在网格中的数据,它也适用于下拉菜单,如果它是粘贴的值…cast命令来自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>();
    } 
}

检测您要粘贴到的单元格是一个组合框,并适当设置它

的例子:

if (oCell is DataGridViewComboBoxCell)
{
    DataGridViewComboBoxCell tmp = oCell as DataGridViewComboBoxCell;
    if (tmp.Items.Contains(sCells[i]))
    {
        tmp.Value = tmp.Items[tmp.Items.IndexOf(sCells[i])];
    }
}