dbgrid中数据录入问题
如何在dbgrid中录入数据对某个字段采用下拉框进行选择,而不能直接输入.而且下拉框列表资料来源于某个数据表.

解决方案 »

  1.   

    要重载datagrid。
    加combobox控件。
      

  2.   

    转贴
    本文将介绍如何在 System.Windows.Forms.DataGrid中切入使用ComboBox控件,主要包括三方面的内容。   1. 在DataGrid中加入ComboBox列;  2. 把在DataGrid中的修改保存到对应的网格;
     
      3. 设置DataGrid中网格的焦点。
      下面是整个源代码,一些功能可以看注释。using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;namespace DataGridTest
    {
     public class Form1 : System.Windows.Forms.Form
     {
      private System.Windows.Forms.DataGrid dgdFunctionArea;
      private DataTable dtblFunctionalArea;
      private System.Windows.Forms.Button buttonFocus;
      private System.ComponentModel.Container components = null;  public Form1()
      {
       InitializeComponent();
       PopulateGrid();
      }  protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if (components != null) 
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }  #region Windows 窗体设计器生成的代码  private void InitializeComponent()
      {
       this.dgdFunctionArea = new System.Windows.Forms.DataGrid();
       this.buttonFocus = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.dgdFunctionArea)).BeginInit();
       this.SuspendLayout();
       // 
       // dgdFunctionArea
       // 
       this.dgdFunctionArea.DataMember = "";
       this.dgdFunctionArea.HeaderForeColor = System.Drawing.SystemColors.ControlText;   this.dgdFunctionArea.Location = new System.Drawing.Point(4, 8);
       this.dgdFunctionArea.Name = "dgdFunctionArea";
       this.dgdFunctionArea.Size = new System.Drawing.Size(316, 168);
       this.dgdFunctionArea.TabIndex = 0;
       // 
       // buttonFocus
       // 
       this.buttonFocus.Location = new System.Drawing.Point(232, 188);
       this.buttonFocus.Name = "buttonFocus";
       this.buttonFocus.Size = new System.Drawing.Size(84, 23);
       this.buttonFocus.TabIndex = 1;
       this.buttonFocus.Text = "获取焦点";
       this.buttonFocus.Click += new System.EventHandler(this.buttonFocus_Click);
       // 
       // Form1
       // 
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.ClientSize = new System.Drawing.Size(332, 217);
       this.Controls.Add(this.buttonFocus);
       this.Controls.Add(this.dgdFunctionArea);
       this.Name = "Form1";
       this.Text = "Form1";
       ((System.ComponentModel.ISupportInitialize)(this.dgdFunctionArea)).EndInit();
       this.ResumeLayout(false);  }
      #endregion
      /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
      [STAThread]
      static void Main() 
      {
       Application.Run(new Form1());
      }
      //初始化DataGrid
      private void PopulateGrid()
      {
       //创建一个DataTable对象,包括四列,前三列为String,最后一列为Boolean。
       dtblFunctionalArea = new DataTable ("FunctionArea");
       string[] arrstrFunctionalArea = new string [3]{"Functional Area","Min","Max"};
       DataColumn dtCol = null;
       //创建String列 
       for(int i=0; i< 3;i++)
       { 
        dtCol = new DataColumn(arrstrFunctionalArea[i]);
        dtCol.DataType = Type.GetType("System.String");
        dtCol.DefaultValue = "";
        dtblFunctionalArea.Columns.Add(dtCol); 
       }    //创建Boolean列,用CheckedBox来显示。 
       DataColumn dtcCheck = new DataColumn("IsMandatory");
       dtcCheck.DataType = System.Type.GetType("System.Boolean");
       dtcCheck.DefaultValue = false;
       dtblFunctionalArea.Columns.Add(dtcCheck);   //把表绑定到DataGrid
       dgdFunctionArea.DataSource = dtblFunctionalArea;    //为DataGrid加载DataGridTableStyle样式
       if(!dgdFunctionArea.TableStyles.Contains("FunctionArea"))
       {
        DataGridTableStyle dgdtblStyle = new DataGridTableStyle();
        dgdtblStyle.MappingName = dtblFunctionalArea.TableName;
        dgdFunctionArea.TableStyles.Add(dgdtblStyle);
        dgdtblStyle.RowHeadersVisible = false;
        dgdtblStyle.HeaderBackColor = Color.LightSteelBlue;
        dgdtblStyle.AllowSorting = false;
        dgdtblStyle.HeaderBackColor = Color.FromArgb(8,36,107);
        dgdtblStyle.RowHeadersVisible = false;
        dgdtblStyle.HeaderForeColor = Color.White;
        dgdtblStyle.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 9F, 
        System.Drawing.FontStyle.Bold, 
        System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
        dgdtblStyle.GridLineColor = Color.DarkGray;
        dgdtblStyle.PreferredRowHeight = 22;
        dgdFunctionArea.BackgroundColor = Color.White;     //设置列的宽度 
        GridColumnStylesCollection colStyle = dgdFunctionArea.TableStyles[0].GridColumnStyles;
        colStyle[0].Width = 100;
        colStyle[1].Width = 50;
        colStyle[2].Width = 50;
        colStyle[3].Width = 80;
       }   DataGridTextBoxColumn dgtb = (DataGridTextBoxColumn)dgdFunctionArea.TableStyles[0].GridColumnStyles[0];    ComboBox cmbFunctionArea = new ComboBox();
       cmbFunctionArea.Items.AddRange(new object[]{"选项一","选项二","选项三"});
       cmbFunctionArea.Cursor = Cursors.Arrow;
       cmbFunctionArea.DropDownStyle= ComboBoxStyle.DropDownList;
       cmbFunctionArea.Dock = DockStyle.Fill;   //在选定项发生更改并且提交了该更改后发生   cmbFunctionArea.SelectionChangeCommitted += new  EventHandler(cmbFunctionArea_SelectionChangeCommitted);    //把ComboBox添加到DataGridTableStyle的第一列   dgtb.TextBox.Controls.Add(cmbFunctionArea);   }  //设置焦点模拟  private void GetFocus(int row,int col)
      {
       //先把焦点移动到DataGrid
       this.dgdFunctionArea.Focus(); 
       //把焦点移动到DataGridCell
       DataGridCell dgc = new DataGridCell(row,col); 
       this.dgdFunctionArea.CurrentCell = dgc; 
       DataGridTextBoxColumn dgtb = (DataGridTextBoxColumn)dgdFunctionArea.TableStyles[0].GridColumnStyles[col];    //设置焦点   dgtb.TextBox.Focus();
      }   //把Combobox上修改的数据提交到当前的网格 private void cmbFunctionArea_SelectionChangeCommitted(object sender, EventArgs e)
     {
      this.dgdFunctionArea[this.dgdFunctionArea.CurrentCell] = ((ComboBox)sender).SelectedItem.ToString(); }  //设置新的焦点 private void buttonFocus_Click(object sender, System.EventArgs e)
     {
      //焦点模拟,这里设置第三行第一列
      GetFocus(2,0);
     }
    }} 
      总结,这里是通过DataGridTextBoxColumn.TextBox.Controls.Add方法实现在列中添加ComboBox控件;对于数据的保存是使用ComboBox.SelectionChangeCommitted事件来完成;设置焦点是通过DataGridTextBoxColumn.TextBox.Focus方法来实现。另外通过这个方法也可以添加DateTimePicker等类似的控件。
      

  3.   

    to q_po_o:
      我建立了一个form,将button和datagrid设成相应的名字,反应如下:
       未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。
      

  4.   

    1、更改你的datagrid的设置,加一个模板列,在模板中加入你的DropDownList2、在点击编辑的时候定位到你的DropDownList,执行数据绑定
    你查询一下,这样的问题有很多的
      

  5.   

    ----------------前台---------------------
    <asp:datagrid id="DataGrid1" runat="server" Width="100%" AutoGenerateColumns="False" ForeColor="Black"
    GridLines="Vertical" CellPadding="4" BackColor="White" BorderWidth="1px" BorderStyle="None"
    BorderColor="#DEDFDE">
    <FooterStyle BackColor="#CCCC99"></FooterStyle>
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#CE5D5A"></SelectedItemStyle>
    <AlternatingItemStyle BackColor="White"></AlternatingItemStyle>
    <ItemStyle Font-Size="10pt" BackColor="#F7F7DE"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#6B696B"></HeaderStyle>
    <Columns>
    <asp:TemplateColumn HeaderText="所属组">
    <HeaderStyle Width="10%"></HeaderStyle>
    <ItemTemplate>
    <FONT face="宋体">
    <asp:Label id="Label5" runat="server">
    <%#DataBinder.Eval(Container.DataItem,"gname")%>
    </asp:Label></FONT>
    </ItemTemplate>
    <EditItemTemplate>
    <asp:DropDownList id="DropDownList2" runat="server" Width="80px"></asp:DropDownList>
    </EditItemTemplate>
    </asp:TemplateColumn> </asp:TemplateColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="#F7F7DE" Mode="NumericPages"></PagerStyle>
    </asp:datagrid>
    ------------------------------------------
      

  6.   

    --------------------后台------------------
    private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    DropDownList list =(DropDownList)e.Item.FindControl("DropDownList2");
    list=(DropDownList)e.Item.FindControl("DropDownList2");
    if(list!=null)
    {
    list.DataSource=dp.get_all_groups();
    list.DataTextField="name";
    list.DataValueField="id";
    list.DataBind();
    }
    }
    ------------------------------------------
      

  7.   

    现在我的comboBox倒是加进去了,但是每次显示dataGrid的数据时,若焦点在下拉框上时,显示的不是该下拉框记录的值,而是该下拉框选项的第一个值,是什么原因呢?
      

  8.   

    to q_po_o:
      根据你给的代码,可以在datagrid中加入combobox了,但是我使用的是关系表,combobox是用在关系子表中,当对关联中的数据保存后,数据保存成功,主表的datagrid显示正常,但是在子表的datagrid中却没有显示刚才输入的行或者显示为第一行的数据.用了refresh也不行.