dbgrid中数据录入问题,急! dbgrid中数据录入问题如何在dbgrid中录入数据对某个字段采用下拉框进行选择,而不能直接输入.而且下拉框列表资料来源于某个数据表. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要重载datagrid。加combobox控件。 转贴本文将介绍如何在 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等类似的控件。 to q_po_o: 我建立了一个form,将button和datagrid设成相应的名字,反应如下: 未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。 1、更改你的datagrid的设置,加一个模板列,在模板中加入你的DropDownList2、在点击编辑的时候定位到你的DropDownList,执行数据绑定你查询一下,这样的问题有很多的 ----------------前台---------------------<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>------------------------------------------ --------------------后台------------------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(); } }------------------------------------------ 现在我的comboBox倒是加进去了,但是每次显示dataGrid的数据时,若焦点在下拉框上时,显示的不是该下拉框记录的值,而是该下拉框选项的第一个值,是什么原因呢? to q_po_o: 根据你给的代码,可以在datagrid中加入combobox了,但是我使用的是关系表,combobox是用在关系子表中,当对关联中的数据保存后,数据保存成功,主表的datagrid显示正常,但是在子表的datagrid中却没有显示刚才输入的行或者显示为第一行的数据.用了refresh也不行. 就创建了个窗体....尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 C#求一个精准的计时器 求助xml的读取问题 第一次用socket类,请问客户端连接了,服务器端怎么捕获连接的事件? 如何将一个对象读取到流? 这两个构造函数能否合为一个,只有一个参数类型不同,函数体完全相同 思归,孟子大哥及各位高手救急啊!如何取图片的颜色值,帧数(gif)等信息 为什么不能更新数据库?急急急急 如何用ultraedit-32构建C#开发环境? SendMessage发送鼠标事件不成功,麻烦帮我看下问题出在哪里 给滚动条换图片 为何不能设置ComboBox.Text的值
加combobox控件。
本文将介绍如何在 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等类似的控件。
我建立了一个form,将button和datagrid设成相应的名字,反应如下:
未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。
你查询一下,这样的问题有很多的
<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>
------------------------------------------
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();
}
}
------------------------------------------
根据你给的代码,可以在datagrid中加入combobox了,但是我使用的是关系表,combobox是用在关系子表中,当对关联中的数据保存后,数据保存成功,主表的datagrid显示正常,但是在子表的datagrid中却没有显示刚才输入的行或者显示为第一行的数据.用了refresh也不行.