WinForm中DataGridView折叠控件【超好看】

2025-05-29 0 45

刚到一家新公司,领导下发任务要用cs系统做一个表格折叠显示,这真是把我难倒了,自己工作6年一直以来都是做BS的系统。这如果在BS里面那太简单了,JqGrid默认都自带,可是DataGridview不支持折叠啊。自己一点经验没有,怎么办呢?于是上网搜了相关视频,资料,开始学习起来。最后借鉴源码封了这么一个东西,发出来分享下,也能让自己加深印象。

首先不多说,上图。如果大家感谢还不错,请继续往下阅读:

WinForm中DataGridView折叠控件【超好看】

WinForm中DataGridView折叠控件【超好看】

WinForm中DataGridView折叠控件【超好看】

WinForm中DataGridView折叠控件【超好看】

大概的效果就是这样。

上代码。

1、首先重写DataGridview,代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427
public class MasterControl : DataGridView

{

#region 字段

private List<int> rowCurrent = new List<int>();

internal static int rowDefaultHeight = ;

internal static int rowExpandedHeight = ;

internal static int rowDefaultDivider = ;

internal static int rowExpandedDivider = - ;

internal static int rowDividerMargin = ;

internal static bool collapseRow;

     //detailControl变量作为一个容器用来保存子表格

public detailControl childView = new detailControl() { Visible = false }; // VBConversions Note: Initial value cannot be assigned here since it is non-static. Assignment has been moved to the class constructors.

//

internal System.Windows.Forms.ImageList RowHeaderIconList;

private System.ComponentModel.Container components = null;

//

DataSet _cDataset;

string _foreignKey;

string _primaryKey;

string _filterFormat;

private controlType EControlType;

public int ExpandRowIndex = ;

#endregion

#region 构造函数

/// <summary>

/// 通过传递过来的枚举判断是两级还是三级展开,表的对应关系通过Relations来读取

/// 所以调用此构造函数的时候必须要讲Relations设置正确,才能正确显示层级关系。

/// oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns["Menu_ID"], oDataSet.Tables["T"].Columns["Menu_ID"]);

/// oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns["Menu_Name"], oDataSet.Tables["T"].Columns["Menu_Name"]);

/// 这两次Add的顺序不能颠倒,必须先添加一、二级的表关联,再添加二、三级的表关联

/// </summary>

/// <param name="cDataset">数据源DataSet,里面还有各个表的对应关系</param>

/// <param name="eControlType">枚举类型</param>

public MasterControl(DataSet cDataset, controlType eControlType)

{

SetMasterControl(cDataset, eControlType);

}

/// <summary>

/// 第二种使用方法

/// </summary>

/// <param name="lstData">折叠控件第一层的集合</param>

/// <param name="lstData">折叠控件第二层的集合</param>

/// <param name="lstData">折叠控件第三层的集合</param>

/// <param name="dicRelateKey">第一二层之间对应主外键</param>

/// <param name="dicRelateKey">第二三层之间对应主外键</param>

/// <param name="eControlType">枚举类型</param>

public MasterControl(object lstData, object lstData,

object lstData, Dictionary<string, string> dicRelateKey,

Dictionary<string ,string>dicRelateKey, controlType eControlType)

{

var oDataSet = new DataSet();

try

{

var oTable = new DataTable();

oTable = Fill(lstData);

oTable.TableName = "T";

var oTable = Fill(lstData);

oTable.TableName = "T";

if (lstData == null || dicRelateKey == null || dicRelateKey.Keys.Count <= )

{

oDataSet.Tables.AddRange(new DataTable[] { oTable, oTable });

oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);

}

else

{

var oTable = Fill(lstData);

oTable.TableName = "T";

oDataSet.Tables.AddRange(new DataTable[] { oTable, oTable, oTable });

//这是对应关系的时候主键必须唯一

oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);

oDataSet.Relations.Add("", oDataSet.Tables["T"].Columns[dicRelateKey.Keys.FirstOrDefault()], oDataSet.Tables["T"].Columns[dicRelateKey.Values.FirstOrDefault()]);

}

}

catch

{

oDataSet = new DataSet();

}

SetMasterControl(oDataSet, eControlType);

}

/// <summary>

/// 控件初始化

/// </summary>

private void InitializeComponent()

{

this.components = new System.ComponentModel.Container();

base.RowHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(MasterControl_RowHeaderMouseClick);

base.RowPostPaint += new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(MasterControl_RowPostPaint);

base.Scroll += new System.Windows.Forms.ScrollEventHandler(MasterControl_Scroll);

base.SelectionChanged += new System.EventHandler(MasterControl_SelectionChanged);

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MasterControl));

this.RowHeaderIconList = new System.Windows.Forms.ImageList(this.components);

((System.ComponentModel.ISupportInitialize)this).BeginInit();

this.SuspendLayout();

//

//RowHeaderIconList

//

this.RowHeaderIconList.ImageStream = (System.Windows.Forms.ImageListStreamer)(resources.GetObject("RowHeaderIconList.ImageStream"));

this.RowHeaderIconList.TransparentColor = System.Drawing.Color.Transparent;

this.RowHeaderIconList.Images.SetKeyName(, "expand.png");

this.RowHeaderIconList.Images.SetKeyName(, "collapse.png");

//

//MasterControl

//

((System.ComponentModel.ISupportInitialize)this).EndInit();

this.ResumeLayout(false);

}

#endregion

#region 数据绑定

/// <summary>

/// 设置表之间的主外键关联

/// </summary>

/// <param name="tableName">DataTable的表名称</param>

/// <param name="foreignKey">外键</param>

public void setParentSource(string tableName, string primarykey, string foreignKey)

{

this.DataSource = new DataView(_cDataset.Tables[tableName]);

cModule.setGridRowHeader(this);

_foreignKey = foreignKey;

_primaryKey = primarykey;

if (_cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(int).ToString()

|| _cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(double).ToString()

|| _cDataset.Tables[tableName].Columns[primarykey].GetType().ToString() == typeof(decimal).ToString())

{

_filterFormat = foreignKey + "={}";

}

else

{

_filterFormat = foreignKey + "=\\'{}\\'";

}

}

#endregion

#region 事件

//控件的行头点击事件

private void MasterControl_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)

{

try

{

Rectangle rect = new Rectangle(System.Convert.ToInt((double)(rowDefaultHeight - ) / ), System.Convert.ToInt((double)(rowDefaultHeight - ) / ), , );

if (rect.Contains(e.Location))

{

//缩起

if (rowCurrent.Contains(e.RowIndex))

{

rowCurrent.Clear();

this.Rows[e.RowIndex].Height = rowDefaultHeight;

this.Rows[e.RowIndex].DividerHeight = rowDefaultDivider;

this.ClearSelection();

collapseRow = true;

this.Rows[e.RowIndex].Selected = true;

if (EControlType == controlType.middle)

{

var oParent = ((MasterControl)this.Parent.Parent);

oParent.Rows[oParent.ExpandRowIndex].Height = rowDefaultHeight * (this.Rows.Count + );

oParent.Rows[oParent.ExpandRowIndex].DividerHeight = rowDefaultHeight * (this.Rows.Count + );

if (oParent.Rows[oParent.ExpandRowIndex].Height > )

{

oParent.Rows[oParent.ExpandRowIndex].Height = ;

oParent.Rows[oParent.ExpandRowIndex].Height = ;

}

}

}

//展开

else

{

if (!(rowCurrent.Count == ))

{

var eRow = rowCurrent[];

rowCurrent.Clear();

this.Rows[eRow].Height = rowDefaultHeight;

this.Rows[eRow].DividerHeight = rowDefaultDivider;

this.ClearSelection();

collapseRow = true;

this.Rows[eRow].Selected = true;

}

rowCurrent.Add(e.RowIndex);

this.ClearSelection();

collapseRow = true;

this.Rows[e.RowIndex].Selected = true;

this.ExpandRowIndex = e.RowIndex;

this.Rows[e.RowIndex].Height = + rowDefaultHeight * (((DataView)(childView.childGrid[].DataSource)).Count + );

this.Rows[e.RowIndex].DividerHeight = + rowDefaultHeight * (((DataView)(childView.childGrid[].DataSource)).Count);

//设置一个最大高度

if (this.Rows[e.RowIndex].Height > )

{

this.Rows[e.RowIndex].Height = ;

this.Rows[e.RowIndex].DividerHeight = ;

}

if (EControlType == controlType.middle)

{

if (this.Parent.Parent.GetType() != typeof(MasterControl))

return;

var oParent = ((MasterControl)this.Parent.Parent);

oParent.Rows[oParent.ExpandRowIndex].Height = this.Rows[e.RowIndex].Height + rowDefaultHeight * (this.Rows.Count + );

oParent.Rows[oParent.ExpandRowIndex].DividerHeight = this.Rows[e.RowIndex].DividerHeight + rowDefaultHeight * (this.Rows.Count + );

if (oParent.Rows[oParent.ExpandRowIndex].Height > )

{

oParent.Rows[oParent.ExpandRowIndex].Height = ;

oParent.Rows[oParent.ExpandRowIndex].Height = ;

}

}

//if (EControlType == controlType.outside)

//{

// //SetControl(this);

//}

//this.Rows[e.RowIndex].Height = rowExpandedHeight;

//this.Rows[e.RowIndex].DividerHeight = rowExpandedDivider;

}

//this.ClearSelection();

//collapseRow = true;

//this.Rows[e.RowIndex].Selected = true;

}

else

{

collapseRow = false;

}

}

catch (Exception ex)

{

}

}

//控件的行重绘事件

private void MasterControl_RowPostPaint(object obj_sender, DataGridViewRowPostPaintEventArgs e)

{

try

{

var sender = (DataGridView)obj_sender;

//set childview control

var rect = new Rectangle((int)(e.RowBounds.X + ((double)(rowDefaultHeight - ) / )), (int)(e.RowBounds.Y + ((double)(rowDefaultHeight - ) / )), , );

if (collapseRow)

{

if (this.rowCurrent.Contains(e.RowIndex))

{

#region 更改点开后背景色 刘金龙

var rect = new Rectangle(e.RowBounds.X, e.RowBounds.Y + rowDefaultHeight, e.RowBounds.Width, e.RowBounds.Height - rowDefaultHeight);

using (Brush b = new SolidBrush(Color.FromArgb(, , )))

{

e.Graphics.FillRectangle(b, rect);

}

#endregion

sender.Rows[e.RowIndex].DividerHeight = sender.Rows[e.RowIndex].Height - rowDefaultHeight;

e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.collapse], rect);

childView.Location = new Point(e.RowBounds.Left + sender.RowHeadersWidth, e.RowBounds.Top + rowDefaultHeight + );

childView.Width = e.RowBounds.Right - sender.RowHeadersWidth;

childView.Height = System.Convert.ToInt(sender.Rows[e.RowIndex].DividerHeight - );

childView.Visible = true;

}

else

{

childView.Visible = false;

e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.expand], rect);

}

collapseRow = false;

}

else

{

if (this.rowCurrent.Contains(e.RowIndex))

{

#region 更改点开后背景色 刘金龙

var rect = new Rectangle(e.RowBounds.X, e.RowBounds.Y + rowDefaultHeight, e.RowBounds.Width, e.RowBounds.Height - rowDefaultHeight);

using (Brush b = new SolidBrush(Color.FromArgb(,,)))

{

e.Graphics.FillRectangle(b, rect);

}

#endregion

sender.Rows[e.RowIndex].DividerHeight = sender.Rows[e.RowIndex].Height - rowDefaultHeight;

e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.collapse], rect);

childView.Location = new Point(e.RowBounds.Left + sender.RowHeadersWidth, e.RowBounds.Top + rowDefaultHeight + );

childView.Width = e.RowBounds.Right - sender.RowHeadersWidth;

childView.Height = System.Convert.ToInt(sender.Rows[e.RowIndex].DividerHeight - );

childView.Visible = true;

}

else

{

childView.Visible = false;

e.Graphics.DrawImage(RowHeaderIconList.Images[(int)rowHeaderIcons.expand], rect);

}

}

cModule.rowPostPaint_HeaderCount(sender, e);

}

catch

{

}

}

//控件的滚动条滚动事件

private void MasterControl_Scroll(object sender, ScrollEventArgs e)

{

try

{

if (!(rowCurrent.Count == ))

{

collapseRow = true;

this.ClearSelection();

this.Rows[rowCurrent[]].Selected = true;

}

}

catch

{

}

}

//控件的单元格选择事件

private void MasterControl_SelectionChanged(object sender, EventArgs e)

{

try

{

if (!(this.RowCount == ))

{

if (rowCurrent.Contains(this.CurrentRow.Index))

{

foreach (DataGridView cGrid in childView.childGrid)

{

((DataView)cGrid.DataSource).RowFilter = string.Format(_filterFormat, this[_primaryKey, this.CurrentRow.Index].Value);

}

}

}

}

catch

{

}

}

#endregion

#region Private

//设置构造函数的参数

private void SetMasterControl(DataSet cDataset, controlType eControlType)

{

//.控件初始化赋值

this.Controls.Add(childView);

InitializeComponent();

_cDataset = cDataset;

childView._cDataset = cDataset;

cModule.applyGridTheme(this);

Dock = DockStyle.Fill;

EControlType = eControlType;

this.AllowUserToAddRows = false;

//.通过读取DataSet里面的Relations得到表的关联关系

if (cDataset.Relations.Count <= )

{

return;

}

DataRelation oRelates;

if (eControlType == controlType.outside)

{

oRelates = cDataset.Relations[];

childView.Add(oRelates.ParentTable.TableName, oRelates.ParentColumns[].ColumnName, oRelates.ChildColumns[].ColumnName);

}

else if (eControlType == controlType.middle)

{

oRelates = cDataset.Relations[cDataset.Relations.Count - ];

childView.Add(oRelates.ChildTable.TableName);

}

//.设置主外键对应关系

oRelates = cDataset.Relations[];

//主表里面的值,副表里面的过滤字段

setParentSource(oRelates.ParentTable.TableName,oRelates.ParentColumns[].ColumnName, oRelates.ChildColumns[].ColumnName);

}

private void SetControl(MasterControl oGrid)

{

oGrid.childView.RemoveControl();

//oGrid.childView.Controls.RemoveByKey("ChildrenMaster");

//

//var oRelates = _cDataset.Relations[];

//oGrid.childView.Add(oRelates.ParentTable.TableName, oRelates.ChildColumns[].ColumnName);

//foreach (var oGridControl in oGrid.Controls)

//{

// if (oGridControl.GetType() != typeof(detailControl))

// {

// continue;

// }

// var DetailControl =(detailControl)oGridControl;

// foreach (var odetailControl in DetailControl.Controls)

// {

// if (odetailControl.GetType() != typeof(MasterControl))

// {

// continue;

// }

// var OMasterControl = (MasterControl)odetailControl;

// foreach (var oMasterControl in OMasterControl.Controls)

// {

// if (oMasterControl.GetType() == typeof(detailControl))

// {

// ((detailControl)oMasterControl).Visible = false;

// return;

// }

// }

// }

//}

}

//将List集合转换成DataTable

private DataTable Fill(object obj)

{

if(!(obj is IList))

{

return null;

}

var objlist = obj as IList;

if (objlist == null || objlist.Count <= )

{

return null;

}

var tType = objlist[];

DataTable dt = new DataTable(tType.GetType().Name);

DataColumn column;

DataRow row;

System.Reflection.PropertyInfo[] myPropertyInfo = tType.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (var t in objlist)

{

if (t == null)

{

continue;

}

row = dt.NewRow();

for (int i = , j = myPropertyInfo.Length; i < j; i++)

{

System.Reflection.PropertyInfo pi = myPropertyInfo[i];

string name = pi.Name;

if (dt.Columns[name] == null)

{

column = new DataColumn(name, pi.PropertyType);

dt.Columns.Add(column);

}

row[name] = pi.GetValue(t, null);

}

dt.Rows.Add(row);

}

return dt;

}

#endregion

}

2、detailControl变量作为一个容器用来保存子表格

代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42
public class detailControl : Ewin.Client.Frame.Controls.EwinPanel

{

#region 字段

public List<DataGridView> childGrid = new List<DataGridView>();

public DataSet _cDataset;

#endregion

#region 方法

public void Add(string tableName, string strPrimaryKey, string strForeignKey)

{

//TabPage tPage = new TabPage() { Text = pageCaption };

//this.Controls.Add(tPage);

var newGrid = new MasterControl(_cDataset, controlType.middle) { Dock = DockStyle.Fill, DataSource = new DataView(_cDataset.Tables[tableName]) };

newGrid.setParentSource(tableName, strPrimaryKey, strForeignKey);//设置主外键

//newGrid.Name = "ChildrenMaster";

//tPage.Controls.Add(newGrid);

this.Controls.Add(newGrid);

//this.BorderStyle = BorderStyle.FixedSingle;

cModule.applyGridTheme(newGrid);

cModule.setGridRowHeader(newGrid);

newGrid.RowPostPaint += cModule.rowPostPaint_HeaderCount;

childGrid.Add(newGrid);

}

public void Add(string tableName)

{

//TabPage tPage = new TabPage() { Text = pageCaption };

//this.Controls.Add(tPage);

DataGridView newGrid = new Ewin.Client.Frame.Controls.EwinGrid() { Dock = DockStyle.Fill, DataSource = new DataView(_cDataset.Tables[tableName]) };

newGrid.AllowUserToAddRows = false;

//tPage.Controls.Add(newGrid);

this.Controls.Add(newGrid);

cModule.applyGridTheme(newGrid);

cModule.setGridRowHeader(newGrid);

newGrid.RowPostPaint += cModule.rowPostPaint_HeaderCount;

childGrid.Add(newGrid);

}

public void RemoveControl()

{

this.Controls.Remove(childGrid[]);

childGrid.Clear();

}

#endregion

}

3、cModule.cs用来设置样式

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123
namespace Ewin.Client.Frame.UcGrid

{

/// <summary>

/// 折叠控件样式以及行数操作类

/// </summary>

sealed class cModule

{

#region CustomGrid

static System.Windows.Forms.DataGridViewCellStyle dateCellStyle = new System.Windows.Forms.DataGridViewCellStyle { Alignment = DataGridViewContentAlignment.MiddleRight };

static System.Windows.Forms.DataGridViewCellStyle amountCellStyle = new System.Windows.Forms.DataGridViewCellStyle { Alignment = DataGridViewContentAlignment.MiddleRight, Format = "N" };

static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle

{

Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,

BackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),

Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),

ForeColor = System.Drawing.SystemColors.ControlLightLight,

SelectionBackColor = System.Drawing.SystemColors.Highlight,

SelectionForeColor = System.Drawing.SystemColors.HighlightText,

WrapMode = System.Windows.Forms.DataGridViewTriState.True

};

static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle

{

Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,

BackColor = System.Drawing.SystemColors.ControlLightLight,

Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),

ForeColor = System.Drawing.SystemColors.ControlText,

SelectionBackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),

SelectionForeColor = System.Drawing.SystemColors.HighlightText,

WrapMode = System.Windows.Forms.DataGridViewTriState.False

};

static System.Windows.Forms.DataGridViewCellStyle gridCellStyle = new System.Windows.Forms.DataGridViewCellStyle

{

Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft,

BackColor = System.Drawing.Color.WhiteSmoke,

Font = new System.Drawing.Font("Segoe UI", (float)(.F), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte()),

ForeColor = System.Drawing.SystemColors.WindowText,

SelectionBackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte()), System.Convert.ToInt(System.Convert.ToByte())),

SelectionForeColor = System.Drawing.SystemColors.HighlightText,

WrapMode = System.Windows.Forms.DataGridViewTriState.True

};

//设置表格的主题样式

static public void applyGridTheme(DataGridView grid)

{

grid.AllowUserToAddRows = false;

grid.AllowUserToDeleteRows = false;

grid.BackgroundColor = System.Drawing.SystemColors.Window;

grid.BorderStyle = System.Windows.Forms.BorderStyle.None;

grid.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;

grid.ColumnHeadersDefaultCellStyle = gridCellStyle;

grid.ColumnHeadersHeight = ;

grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

grid.DefaultCellStyle = gridCellStyle;

grid.EnableHeadersVisualStyles = false;

grid.GridColor = System.Drawing.SystemColors.GradientInactiveCaption;

//grid.ReadOnly = true;

grid.RowHeadersVisible = true;

grid.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;

grid.RowHeadersDefaultCellStyle = gridCellStyle;

grid.Font = gridCellStyle.Font;

}

//设置表格单元格样式

static public void setGridRowHeader(DataGridView dgv, bool hSize = false)

{

dgv.TopLeftHeaderCell.Value = "NO ";

dgv.TopLeftHeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;

dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders);

foreach (DataGridViewColumn cCol in dgv.Columns)

{

if (cCol.ValueType.ToString() == typeof(DateTime).ToString())

{

cCol.DefaultCellStyle = dateCellStyle;

}

else if (cCol.ValueType.ToString() == typeof(decimal).ToString() || cCol.ValueType.ToString() == typeof(double).ToString())

{

cCol.DefaultCellStyle = amountCellStyle;

}

}

if (hSize)

{

dgv.RowHeadersWidth = dgv.RowHeadersWidth + ;

}

dgv.AutoResizeColumns();

}

//设置表格的行号

static public void rowPostPaint_HeaderCount(object obj_sender, DataGridViewRowPostPaintEventArgs e)

{

try

{

var sender = (DataGridView)obj_sender;

//set rowheader count

DataGridView grid = (DataGridView)sender;

string rowIdx = System.Convert.ToString((e.RowIndex + ).ToString());

var centerFormat = new StringFormat();

centerFormat.Alignment = StringAlignment.Center;

centerFormat.LineAlignment = StringAlignment.Center;

Rectangle headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top,

grid.RowHeadersWidth, e.RowBounds.Height - sender.Rows[e.RowIndex].DividerHeight);

e.Graphics.DrawString(rowIdx, grid.Font, SystemBrushes.ControlText,

headerBounds, centerFormat);

}

catch (Exception ex)

{

}

}

#endregion

}

/// <summary>

/// 控件类型,是最外层的表格还是中间层的表格

/// </summary>

public enum controlType

{

outside = ,

middle =

}

/// <summary>

/// 展开图标

/// </summary>

public enum rowHeaderIcons

{

expand = ,

collapse =

}

}

4、From页面调用

#region 使用方法一

?

1

2

3

4
//var oDataSet = GetDataSet();

//

//masterDetail = new MasterControl(oDataSet, controlType.outside);

#endregion

#region 使用方法二

?

1

2

3

4

5
var dicRelateData1 = new Dictionary<string, string>();

var dicRelateData2 = new Dictionary<string, string>();

dicRelateData1.Add("Menu_ID","Menu_ID");//表格一和表格二之间的主外键关系

dicRelateData2.Add("Menu_Name2","Menu_Name2");//表格二和表格三之间的主外键关系

masterDetail = new MasterControl(GetDataSource(), GetDataSource2(), GetDataSource3(), dicRelateData1, dicRelateData2, controlType.outside); #endregion panelView.Controls.Add(masterDetail);

昨天应领导要求,折叠控件增加了折叠线的效果,看起来有没有更加像模像样了。~~~

其实就在行重绘事件private void MasterControl_RowPostPaint(object obj_sender, DataGridViewRowPostPaintEventArgs e)里面增加了如下代码:

?

1

2

3

4

5

6

7

8

9
using (Pen p = new Pen(Color.GhostWhite))

{

var iHalfWidth = (e.RowBounds.Left + sender.RowHeadersWidth) / 2;

var oPointHLineStart = new Point(rect1.X + iHalfWidth, rect1.Y);

var oPointHLineEnd = new Point(rect1.X + iHalfWidth, rect1.Y + rect1.Height / 2);

e.Graphics.DrawLine(p, oPointHLineStart, oPointHLineEnd);

//折叠线

e.Graphics.DrawLine(p, oPointHLineEnd, new Point(oPointHLineEnd.X + iHalfWidth, oPointHLineEnd.Y));

}


效果如下:

WinForm中DataGridView折叠控件【超好看】

以上所述是小编给大家介绍的WinFormDataGridView折叠控件的相关知识,希望对大家有所帮助!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 WinForm中DataGridView折叠控件【超好看】 https://www.kuaiidc.com/99838.html

相关文章

发表评论
暂无评论