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运行窗体效果如下
默认点击最大化效果如下:
修改后最大化效果如下:控件自动缩放,
步骤实现如下:
1.在窗体中放一个容器(Panel),将容器的Dock属性设置为Fill。窗体中所有控件都放入这个容器中。
2.创建一个窗体类,该窗体类继承于原始窗体类,原来的窗体继承创建的窗体类:如下图所示
新建一个 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("取消填写邀请码!");
}
}
}