技术交流QQ群【JAVA,C,.NET,BigData,AI】:170933152
工作需要,给flexgrid添加自定义类型的单元格,这里自定义了一个radiobutton.
下面这个案例可
以在flexgrid安装后,的samples文件夹中找到,下面是c#的案例.
using C1.Win.C1FlexGrid;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Shopch.Sc.Sp.Player.ShowPlan.SubForm
{
public class HostedControl
{
internal C1FlexGrid _flex;
internal Control _ctl;
internal Row _row;
internal Column _col;
internal Panel _pnl;
internal RadioButton RbtControl;
public delegate void InformHandle(HostedControl sender); //这个部分是自己添加的,自定义事件,给HostedControl
//这个类添加了一个自定义事件
public event InformHandle RbtClick;//添加了一个自定义事件
internal HostedControl(C1FlexGrid flex, RadioButton hosted, int row, int col)
{
_flex = flex;
_ctl = hosted;
_row = flex.Rows[row];
_col = flex.Cols[col];
RbtControl = hosted;
_pnl = new Panel();
_pnl.Controls.Add(_ctl);
hosted.Click += new EventHandler(_rbt_Click);//设置当,自定义的控件这里是radiobutton被
//イベントの実行を追加
//flex.AfterEdit += new RowColEventHandler(_rbt_Click);
// ホストされたコントロールをグリッドに追加します。
_flex.Controls.Add(_pnl);
}
public virtual void OnClick()
{
if (RbtClick != null)
{
RbtClick(this);
}
}
// 通常のスクロールエリアと異なって見せるようにします。(編集時)
private void _rbt_Click(object sender,EventArgs e)
{
OnClick();
}
public bool UpdatePosition()
{
// 行および列のインデックスを取得します。
int r = _row.Index;
int c = _col.Index;
if (r < 0 || c < 0) return false;
// セルの位置を取得します。
Rectangle rc = _flex.GetCellRect(r, c, false);
// セルに収まらない場合コントロールを非表示します。
if (rc.Width <= 0 || rc.Height <= 0 || !rc.IntersectsWith(_flex.ClientRectangle))
{
_pnl.Visible = false;
return true;
}
// コントロールを表示します。
_pnl.Bounds = rc;
_pnl.BackColor = Color.Transparent;
_ctl.Location = new Point((_pnl.Width - _ctl.Width) / 2, (_pnl.Height - _ctl.Height) / 2);
_pnl.Visible = true;
return true;
}
}
}
利用上面的这个类,来给flexgrid添加自定义控件:
我这里添加radiobutton
首先在form类中,添加:全局变量
List<HostedControl> hostedControlList = new List<HostedControl>();
private int RbtTagIndex;
RbtTagIndex 添加这个一个全局变量,在load中,设置为0,用来记录,添加到flexgrid中的自定义控件
在进行给单元格赋值的时候:
进行下面的操作:
首先清除原有控件
hostedControlList.Clear();
C1flegridTest.Controls.Clear();
RbtTagIndex = RbtTagIndex + 1;
var radioBtn = new RadioButton();
radioBtn = new RadioButton();
radioBtn.BackColor = Color.Transparent;
radioBtn.Text = "";
radioBtn.AutoSize = true;
radioBtn.Checked = true;
radioBtn.Tag = Convert.ToString(RbtTagIndex) + "-1";
HostedControl hostedControlTmp = new HostedControl(C1flexgridTest, radioBtn, i, C1fShowDetail.Cols["TestRbt1"].Index);//把自定义控件添加到某一行,某一列上
hostedControlTmp.RbtClick += new HostedControl.InformHandle(RbtClickEvent);//给这个自定义控件添加上自定义的事件
hostedControlList.Add(hostedControlTmp);
然后添加一个事件 来更新,自定义控件的位置:
private void C1fShowDetail_Paint(object sender, PaintEventArgs e)
{
foreach (HostedControl hosted in hostedControlList)
hosted.UpdatePosition();
}
//下面当点击单元格中的自定义控件的时候,就会自动触发,下面的事件,这样就可以在这个事件中控制,自定义的单元格控件了
private void RbtClickEvent(HostedControl sender) {
HostedControl hostedControlTmp = sender;
String tag = Convert.ToString(hostedControlTmp.RbtControl.Tag);
String tag0 = tag.Split('-')[0];
String tag1 = tag.Split('-')[1];
String tag2 = "";
String tag3 = "";
if (tag1.Equals("1")) {
tag2 = "2";
tag3 = "3";
} else if (tag1.Equals("2")) {
tag2 = "1";
tag3 = "3";
}
else if (tag1.Equals("3"))
{
tag2 = "1";
tag3 = "2";
}
String searchStr1 = "";
String searchStr2 = "";
searchStr1 = tag0 + "-" + tag2;
searchStr2 = tag0 + "-" + tag3;
foreach (HostedControl hosted in hostedControlList) {
if (Convert.ToString(hosted.RbtControl.Tag).Equals(searchStr1)) {
hosted.RbtControl.Checked = false;
}else if (Convert.ToString(hosted.RbtControl.Tag).Equals(searchStr2))
{
hosted.RbtControl.Checked = false;
}
}
}