C#winform在DataGridView控件中加入ComboBox下拉列表框

private void mainForm_Load(object sender, EventArgs e)
        {
            string sqll = "select * from Type";

            List<string> ListData = new List<string> { "张三", "里斯", "王六" };
            DataGridViewComboBoxColumn column1 = new DataGridViewComboBoxColumn();
            column1.Name = "Name";
            column1.DataPropertyName = "Name";//对应数据源的字段
            column1.HeaderText = "combox姓名";
            column1.Width = 80;
            this.dataGridView1.Columns.Add(column1);
            column1.DataSource = ListData; 
           //数据库的
            DataGridViewComboBoxColumn column12 = new DataGridViewComboBoxColumn();
            column12.DisplayMember = "Type";
            column12.ValueMember = "TypeID";
            column12.HeaderText = "combox类型";
            column12.Width = 80;
            this.dataGridView1.Columns.Add(column12);
            column12.DataSource = DBHelper.ExecuteTable(sqll);
          //文本的
            //DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            //column.Name = "name";
            //column.DataPropertyName = "name";//对应数据源的字段
            //column.HeaderText = "文本类型";
            //column.Width = 80;
            //this.dataGridView1.Columns.Add(column);
            string sql = "select name 法律,t.Type 类型,description 内容 from book g,Type t where t.TypeID=g.TypeID";
            dataGridView1.DataSource = DBHelper.ExecuteTable(sql);
            / string sqll = "select * from Type";
            cbx1.DataSource = DBHelper.ExecuteTable(sqll);
            cbx1.DisplayMember = "Type";
            cbx1.ValueMember = "TypeID";
        }

   private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            ComboBox combo = e.Control as ComboBox;
            if (combo != null)
            {
                combo.SelectedIndexChanged +=
                new EventHandler(ComboBox_SelectedIndexChanged);
            }

        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox combo = sender as ComboBox;
            string selectedItem = combo.Text;//拿到选择后的值
        }
设置单击下拉模式(否则需要点两下才能显示下拉框):
DataGridView属性 EditMode 为 EditOnEnter  
EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dgv_EditingControlShowing);

Winform 窗体控件最大化自适应控件居中

总结:写一个NForm继承原生Form,自定义的form1继承改为NForm load里面加载rezize

窗体所有控件居中显示自适应放大,1运行窗体效果如下

img

默认点击最大化效果如下:

img

修改后最大化效果如下:控件自动缩放,

img

步骤实现如下:

1.在窗体中放一个容器(Panel),将容器的Dock属性设置为Fill。窗体中所有控件都放入这个容器中。

2.创建一个窗体类,该窗体类继承于原始窗体类,原来的窗体继承创建的窗体类:如下图所示

img

新建一个 NForm 窗体类,继承默认窗体类 Form ,而原来的 Form1 :Form 窗体类继承的默认窗体类修改为 Form1 :NForm 自定义新建的窗体类。

新建窗体类代码如下:

  public partial class NForm : Form
    {
        #region 控件缩放
        double formWidth;//窗体原始宽度
        double formHeight;//窗体原始高度
        double scaleX;//水平缩放比例
        double scaleY;//垂直缩放比例
        Dictionary<string, string> controlInfo = new Dictionary<string, string>();
        //控件中心Left,Top,控件Width,控件Height,控件字体Size
        /// <summary>
        /// 获取所有原始数据
        /// </summary>
        protected void GetAllInitInfo(Control CrlContainer)
        {
            if (CrlContainer.Parent == this)
            {
                formWidth = Convert.ToDouble(CrlContainer.Width);
                formHeight = Convert.ToDouble(CrlContainer.Height);
            }
            foreach (Control item in CrlContainer.Controls)
            {
                if (item.Name.Trim() != "")
                    controlInfo.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) + "," + item.Width + "," + item.Height + "," + item.Font.Size);
                if ((item as UserControl) == null && item.Controls.Count > 0)
                    GetAllInitInfo(item);
            }
        }
        private void ControlsChangeInit(Control CrlContainer)
        {
            scaleX = (Convert.ToDouble(CrlContainer.Width) / formWidth);
            scaleY = (Convert.ToDouble(CrlContainer.Height) / formHeight);
        }
        private void ControlsChange(Control CrlContainer)
        {
            double[] pos = new double[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
            foreach (Control item in CrlContainer.Controls)
            {
                if (item.Name.Trim() != "")
                {
                    if ((item as UserControl) == null && item.Controls.Count > 0)
                        ControlsChange(item);
                    string[] strs = controlInfo[item.Name].Split(',');
                    for (int j = 0; j < 5; j++)
                    {
                        pos[j] = Convert.ToDouble(strs[j]);
                    }
                    double itemWidth = pos[2] * scaleX;
                    double itemHeight = pos[3] * scaleY;
                    item.Left = Convert.ToInt32(pos[0] * scaleX - itemWidth / 2);
                    item.Top = Convert.ToInt32(pos[1] * scaleY - itemHeight / 2);
                    item.Width = Convert.ToInt32(itemWidth);
                    item.Height = Convert.ToInt32(itemHeight);
                    try{
                        item.Font = new Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString()));
                    }
                    catch{
                    }            
                }
            }
        }
 
        #endregion
 
 
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            if (controlInfo.Count > 0)
            {
                ControlsChangeInit(this.Controls[0]);
                ControlsChange(this.Controls[0]);
            }
        }
    }

新建的窗体类中主要包括自定义几个方法,用以实现控件自适应

(1)获取控件初始信息;GetAllInitInfo()

(2)获取窗体缩放比例;ControlsChaneInit()

(3)窗体改变时修改控件大小。ControlsChange()

最后。在窗体类的构造函数中调用获取初始数据的方法:

 public Form1()
        {
            InitializeComponent();
            GetAllInitInfo(this.Controls[0]);
        }

这样,一个自适应窗体就实现了,再也不用担心最大化和拖拽后窗体控件位置错位的尴尬了。如果对你有用,请赞一个,欢迎评论留言,更多资料信息请关注

主窗体添加窗体成功后返回主窗体ok刷新

    AddForm add = new AddForm();
            //窗口中叠
            if (add.ShowDialog()== DialogResult.OK)
            {
                var sql = " SELECT Sid '序号', SName '姓名', SAddress '学生类别', State '户口所在地', STel '学生电话', Class '班级编号' FROM dbo.tb_stu";
                dataGridView1.DataSource = DBHelper.ExecuteTable(sql);
            }
添加窗体
 
                string sql = string.Format("insert into tb_stu values('{0}','{1}')", textBox1.Text, textBox2.Text);
            if (DBHelper.ExecuteNonQuery(sql))
            {
                MessageBox.Show("添加成功", "提示", MessageBoxButtons.OK);
                DialogResult = DialogResult.OK;
                //属性链接
          
            }
            else
            {
                MessageBox.Show("添加不成功", "提示", MessageBoxButtons.OK); 
            }
            

dataset直接显示绑定到datagridview需要指定0表格

DataSet list = bll.GetListByPage(where, "createTime desc", startIndex + 1, startIndex + 10);

gridView.DataSource = list; 为什么不显示

根据你提供的代码片段,我看到你在将 DataSet 对象赋值给 gridView.DataSource,但是没有指定要绑定的表格。

在这种情况下,DataSet 可能包含多个数据表,你需要明确指定要绑定的表格名称或索引。

假设你的 DataSet 中只有一个表格,你可以按照以下方式指定要绑定的表格:

gridView.DataSource = list.Tables[0]; // 假设表格的索引为 0
如果你的 DataSet 中有多个表格,你需要确认要绑定的表格的名称或索引。你可以使用 Tables 集合访问其中的表格,例如:

gridView.DataSource = list.Tables["TableName"]; // 替换为你要绑定的表格名称
此外,还需要确保在将数据源分配给 GridView 之后,调用 DataBind 方法来绑定数据并刷新显示:

gridView.DataBind(); // 绑定数据源并刷新显示
通过上述步骤,你应该能够将数据正确显示在 GridView 控件中了。如果问题仍然存在,请提供更多关于 GridView 控件的代码和更详细的问题描述,我将尽力帮助你解决问题。

在把object转换成table对象的时候,row里面添加大于column的行数列数 会出现:“Cannot find column 5.”

   //// 创建数据表格
   //DataTable dataTable2 = new DataTable();

   //// 添加五列
   //for (int i = 1; i <= 5; i++) {
   //    dataTable2.Columns.Add("Column" + i);
   //}

   //// 添加七行数据
   //for (int i = 1; i <= 7; i++) {
   //    DataRow row = dataTable2.NewRow();
   //    for (int j = 0; j < dataTable2.Columns.Count; j++) {
   //        row[j] = "Row" + i + " Column" + (j + 1);
   //    }
   //    dataTable2.Rows.Add(row);
   //}
   通过实现实例找问题

         

            RDotNet.REngine.SetEnvironmentVariables();
            //REngine.SetEnvironmentVariables();
            REngine engine = REngine.GetInstance();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            engine.Initialize();
            engine.Evaluate("source('D:/Rwork/work2 finish 3.0 .R')");
            DataFrame result3 = engine.GetSymbol("sumdata5").AsDataFrame(); 
            // 创建一个数组来保存数据
            DataTable dataTable = new DataTable();
            // 创建列名列表
            List<string> columnNames = new List<string>();
            List<string> rowNames = new List<string>();
            for (int i = 0; i < result3.ColumnCount; i++) {

                var columnName = result3.ColumnNames[i];
                columnNames.Add(columnName);

                var rowName = result3.RowNames[i];
                rowNames.Add(rowName);
                dataTable.Columns.Add(columnName);
                //dataTable.Rows.Add(rowName);

            }
            //var item = result3[i];
            for (int j = 0; j < result3.RowCount; j++) {
                    DataRow row = dataTable.NewRow();
                for (int i = 0; i < result3.ColumnCount; i++) {
                    row[$"{columnNames[i]}"] = result3[i][j];
                    //row[i] = "Row" + j + " Column" + (i + 1);
                } 
                    dataTable.Rows.Add(row);
                } 
            //创建一个DataTable对象
            //List<object> vectorList= new List<object>();
            //for (int i = 0; i < result3.ColumnCount; i++) {
            //    var item = result3[i];
            //    vectorList.Add(item);

            //}

            //for (int i = 0; i < vectorList.Count; i++) {
            //    dataTable.Columns.Add("Column" + (i + 1));
            //}

            //for (int j = 0; j < vectorList.Count; j++) { 
            //    for (int i = 0; i < result3.RowCount; i++) {
            //    DataRow row = dataTable.NewRow(); 
            //    row[j] = result3[j][0];
            //        //row[j] = item[j]; 每一列的显示在第一行, 5.0828571   2.0714286   1.0490476   0.5033333   0.1019048
            //    dataTable.Rows.Add(row); 
            //}
            //}
            // 现在,您可以使用dataTable作为数据源来显示数据,例如在DataGridView中显示
            dataGridView1.DataSource = dataTable;
            //NumericVector result3 = engine.GetSymbol("sumdata5").AsNumeric();
            var resultList = result3.AsDataFrame();
            //dataGridView1.Text += result3.AsDataFrame();

模态对话框 如果要填写邀请码,但是不想新建窗体 还要有确定和取消按钮和逻辑判断使用模态对话框即可

    private void fButton2_Click(object sender, EventArgs e)
        {
            // 创建一个临时的文本框
            TextBox txtInvitationCode = new TextBox();
            txtInvitationCode.Dock = DockStyle.Fill;

            // 创建确定按钮
            Button btnOk = new Button();
            btnOk.Text = "确定";
            btnOk.DialogResult = DialogResult.OK;

            // 创建取消按钮
            Button btnCancel = new Button();
            btnCancel.Text = "取消";
            btnCancel.DialogResult = DialogResult.Cancel;

            // 创建一个模态对话框
            using (Form invitationDialog = new Form())
            {
                invitationDialog.StartPosition = FormStartPosition.CenterScreen;
                invitationDialog.FormBorderStyle = FormBorderStyle.FixedDialog;
                invitationDialog.Text = "填写邀请码";
                invitationDialog.MinimizeBox = false;
                invitationDialog.MaximizeBox = false;
                invitationDialog.AcceptButton = btnOk;
                invitationDialog.CancelButton = btnCancel;

                invitationDialog.Controls.Add(txtInvitationCode);
                invitationDialog.Controls.Add(btnOk);
                invitationDialog.Controls.Add(btnCancel);

                // 设置确定按钮和取消按钮的位置
                btnOk.Location = new Point(50, 50); // 根据实际需要设置位置
                btnCancel.Location = new Point(150, 50); // 根据实际需要设置位置
                                                         // 设置对话框的宽度和高度
                invitationDialog.ClientSize = new Size(300, 120); // 根据实际需要设置宽度和高度
                // 显示模态对话框
                DialogResult dialogResult = invitationDialog.ShowDialog();

                // 根据用户的操作进行逻辑判断
                if (dialogResult == DialogResult.OK)
                {
                    string inviteCode = txtInvitationCode.Text;
                    if (!string.IsNullOrEmpty(inviteCode))
                    {
                        // 执行邀请码验证等逻辑操作
                        Console.WriteLine("邀请码已确认:" + inviteCode);
                      
                    }
                    else
                    {
                        MessageBox.Show("邀请码不能为空!");
                        // 如果为空 继续等待用户输入 不等待直接退出
                        fButton2_Click(sender, e);
                    }
                }
                else
                {
                    //MessageBox.Show("取消填写邀请码!");
                }
            }
        }

End