【问题标题】:Datagridview copy and paste on combobox columnDatagridview 在组合框列上复制和粘贴
【发布时间】:2011-11-16 04:56: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 设置为相同的值,那么它工作正常。但我必须让这些领域保持不同。
有谁知道如何解决这个错误?

提前致谢
维杰

【问题讨论】:

  • 复制什么粘贴到哪里?
  • 假设我有 5 行。我正在从第 1 行复制组合框列值并将其粘贴到同一列的其他 4 行中。

标签: c# copy-paste datagridtemplatecolumn datagridcomboboxcolumn


【解决方案1】:

我使用此代码将数据粘贴到网格中,如果是粘贴的值,我也适用于下拉列表... 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>();
    } 
}

【讨论】:

  • 感谢您的回复。我应该如何将它应用到我当前的示例中?
  • 抱歉,此代码不是您所要求的。但是,捕获 Ctrl+V 和 Ctrl-C 并处理剪贴板仍然是要走的路。
【解决方案2】:

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

例子:

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

【讨论】: