C#问题百解
- Q:C#如何读取并调用json文件
A:代码如下
{
"carList": {
"id": {
"cloumn": "listData1", //车辆ID
"text": "车辆ID",
"visible": false
},
"plateno": {
"cloumn": "listData2", //车辆ID
"text": "车牌号码",
"visible": true
},
"inner_plateno": {
"cloumn": "listData3", //内部车号
"text": "内部车号",
"visible": true
},
"capacity": {
"cloumn": "listData4", //容量
"text": "容量",
"visible": true
},
"capacity_unit": {
"cloumn": "listData5", //容量单位
"text": "容量单位",
"visible": true
},
"partner_name": {
"cloumn": "listData6", //运输商名称
"text": "运输商名称",
"visible": true
},
"partner_code": {
"cloumn": "listData7", //运输商编号
"text": "运输商编号",
"visible": true
},
"station_name": {
"cloumn": "listData8", //站点名称
"text": "站点名称",
"visible": true
},
"station_code": {
"cloumn": "listData9", //站点编号
"text": "站点编号",
"visible": true
},
"owner_info": {
"cloumn": "listData10", //车主及联系电话
"text": "车主及联系电话",
"visible": true
}
}
}
string jsonfile = jsonPath;//JSON文件路径
StreamReader jsonStream = new StreamReader(jsonfile, System.Text.Encoding.Default);
JsonTextReader reader = new JsonTextReader(jsonStream);
JObject job = (JObject)JToken.ReadFrom(reader);
dataGridView1.AutoGenerateColumns = false;//关闭绑定数据源时自动添加列的功能
foreach (JToken jt in job.SelectToken("carList")) {
jpr = jt.ToObject<JProperty>();
jt2 = jt.First;
dc = new DataGridViewTextBoxColumn();
dc.DataPropertyName = jpr.Name;//读取每一项的key值,并作为列表中列项的数据源属性名
dc.HeaderText = jt2["text"].ToString();
dc.Visible = (bool)jt2["visible"];
dataGridView1.Columns.Add(dc);//为列表动态添加列
}
- Q:关闭form顶部的操作栏
A:代码及效果如下
this.ControlBox = false;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a989cddac993a9523e74039e6a09624b.png)
- Q:form居中显示,关闭右上角的最小、最大按钮、页面层级最顶部显示
A:代码及效果如下
this.StartPosition = FormStartPosition.CenterScreen;//窗口居中
MinimizeBox=false;//关闭最小化按钮
MaximizeBox = false;//关闭最大化按钮
this.TopMost = true;//最顶层
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4529009d7ef5f2e1e7cf5cc3bea79816.png)
- Q:datagridview表头样式自定义修改
A:代码及效果如下
dataGridView1.RowHeadersVisible = false;//禁止显示包含行标题的列
dataGridView1.ReadOnly = true;//禁止编辑单元格
dataGridView1.AllowUserToAddRows = false;//禁止向用户显示添加行的选项
dataGridView1.AllowUserToResizeRows = false;//禁止用户调整行的大小
dataGridView1.EnableHeadersVisualStyles = false;//允许修改样式
dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("宋体", 12, FontStyle.Bold); //标题行字体加粗
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;//禁止修改标题行高度
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;//列宽调整到适合列表头单元格的内容
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = colorTableRowDef;
dataGridView1.MultiSelect = false;//只允许选中单行
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行选中
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cd562f57e74ee7bf6f4510697ac19ea0.png)
- Q:多个datagridview绑定同一个数据源时,出现操作同步的情况,如何实现互不影响?
A:多个datagridview绑定同一个数据源时,会出现同步的现象。需要对数据源为每个dgv单独命名数据源。
JProperty jpr;
JToken jt2;
DataGridViewTextBoxColumn dc;
DataGridViewTextBoxColumn dc2;
dataGridView1.AutoGenerateColumns = false;//关闭绑定数据源时自动添加列的功能
dataGridView2.AutoGenerateColumns = false;//关闭绑定数据源时自动添加列的功能
//对第一个dgv动态添加列,并绑定每一列的DataPropertyName
foreach (JToken jt in listJson.SelectToken("carList")) {
jpr = jt.ToObject<JProperty>();
jt2 = jt.First;
dc = new DataGridViewTextBoxColumn();
dc.DataPropertyName = jpr.Name;//读取每一项的key值,并作为列表中列项的数据源属性名
dc.HeaderText = jt2["text"].ToString();
dc.Visible = (bool)jt2["visible"];
dataGridView1.Columns.Add(dc);
}
//对第二个dgv动态添加列,并绑定每一列的DataPropertyName
foreach (JToken jt in listJson.SelectToken("carList"))
{
jpr = jt.ToObject<JProperty>();
jt2 = jt.First;
dc2 = new DataGridViewTextBoxColumn();
dc2.DataPropertyName = jpr.Name;//读取每一项的key值,并作为列表中列项的数据源属性名
dc2.HeaderText = jt2["text"].ToString();
dc2.Visible = (bool)jt2["visible"];
dataGridView2.Columns.Add(dc2);
}
JObject job;
JObject job2;
JinHuoController jh = new JinHuoController();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2.Add("station_code", dict["stationcode"]);
//dict.Add("station_name", StationName);
/*互相影响的写法 开始*/
job = jh.carList(dict2);
dataGridView1.DataSource = job["rows"];
dataGridView2.DataSource = job["rows"];
/*互相影响的写法 结束*/
//如图1
/*互不影响的写法 开始*/ //即 对每个dgv单独命名数据源
job = jh.carList(dict2);
job2 = jh.carList(dict2);
//列表赋值
dataGridView1.DataSource = job["rows"];//多个datagridview绑定同一个数据源时,会出现同步的现象。需要对数据源为每个dgv单独命名数据源
dataGridView2.DataSource = job2["rows"];
/*互不影响的写法 结束*/
//如图2
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3348e4b8f19f1879605e78018fe19f16.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f210d3a330ca65dd4adcec6589dc33fd.png)
- Q:点击窗口右上角关闭按钮,和程序中调用this.Close()的区别?窗口关闭事件的执行过程?
A:没有区别。执行顺序:
1. 第一步,调用FormClosing事件。可以在该事件中,弹出与用户交互的操作。
2. 第二步,调用FormClosed事件。弹出窗口操作,在该事件中不会执行。 - Q:MessageBox.Show()与MessageBox.ShowDialog()的区别?
A:
- MessageBox.Show()显示的页面,可以与其他页面进行来回切换显示。且不影响该行后的代码执行。
textBox1.Text="a";
MessageBox.Show("123");
textBox1.Text="b"; //窗口打开后,这一行代码会执行
- MessageBox.ShowDailog()显示的页面,不能与其他页面进行来回切换,即:必须先关闭这个页面,才能操作其他页面。且后续页面不关闭,该行后的代码不会执行。
textBox1.Text="a";
MessageBox.Show("123");
textBox1.Text="b"; //窗口打开后,这一行代码不会执行
- Q:C#与C、C++的关系?
A:C#继承了C、C++的优点,基于C、C++衍生出来的。 - Q:C#与.NET之间的关系?
A:.NET是开发平台,同时支持多种语音、多种形式开发,如C#,VB、C++等。 - Q:如何修改程序主入口?
A:不需要修改,默认的main基本满足日常正常需求。 - Q:如何在一个类中引入并调用其他类?
A:通过using,调用所需类。 - Q:tabcontrol控件,切换选中是,顶部tab的文字有虚线边框,如何去掉?
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d724019d1c16a184c3188e3e01883de4.png)
A:找遍网上,都是垃圾。解决办法
- 在当前页面中随便一个地方,添加一个groupbox控件,即可解决。我也不知道为啥,实操经验。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6b1ffb55ddac6e7a742aa9372497e907.png)