winforms C#在DataGridView中选中复选框时在文本框中显示值,未选中时清除

zu0ti5jz  于 2022-12-23  发布在  C#
关注(0)|答案(1)|浏览(241)

我在datagridview中有一个复选框列,如果我选中复选框,单元格值将被解析为文本框和组合框,如果不选中将清除所有文本框和组合框。
我已经实现了上面的描述,问题是当我检查它从底部到顶部的顺序,文本框的值不会改变。它将保持不变的第一次检查。
正如我下面的代码片段,文本框应该显示'AZI',因为我在'FRAN'后选中它,但它仍然显示'FRAN'。但如果选中的顺序是'AZI'然后'FRAN',它将正确地表现。

我已经提交了这篇文章How to clear textbox when all checkboxes are unchecked in DataGridView C#
下面是我目前的代码

private void datagridview1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            bool unSel = true;
            foreach (DataGridViewRow row in datagridview1.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["ckbox"];
                bool isSel = (bool)chk.EditedFormattedValue;
                object cell = row.Cells["ckbox"].EditedFormattedValue;
                unSel &= !Convert.ToBoolean(cell);

                if (isSel)
                {
                    combobox1.Text = row.Cells["combobox1"].Value.ToString();
                    textbox1.Text = row.Cells["textbox1"].Value.ToString();
                    textbox2.Text = row.Cells["textbox2"].Value.ToString();
                    textbox3.Text = row.Cells["textbox3"].Value.ToString();
                }
            }
            if (unSel)
            {
                textbox1.Clear();
                cbDoctorList.Text = "";
                textbox2.Clear();
                textbox3.Clear();
            }
        }

感谢您的帮助!

monwx1rj

monwx1rj1#

当你切换DataGridViewCheckBoxCell中的复选框时,它通常会将CurrentCell置于编辑模式,新值不会被提交到单元格,直到DataGridView以某种方式离开编辑模式。
你可以尝试在复选框切换时立即结束编辑,看看先在你的点击处理方法中添加这段代码是否有帮助。

void datagridview1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{            
    if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
    {
        dataGridView.EndEdit();
    }
    .
    .
    .
}

I tested此答案使用您的测试用例,其中选中的顺序是“FRAN”,然后是“AZI”,并且使用下面所示的最小样本按预期工作。

public partial class MainForm : Form
{
    public MainForm() => InitializeComponent();

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        dataGridView.AllowUserToAddRows= false;
        dataGridView.DataSource = Items;
        Items.Add(new Item { Name = "AZI" });
        Items.Add(new Item { Name = "FRAN" });
        dataGridView.Columns[nameof(Item.Selected)].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
        dataGridView.Columns[nameof(Item.Name)].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

        dataGridView.CellContentClick += onCellContentClick;
    }

    private void onCellContentClick(object? sender, DataGridViewCellEventArgs e)
    {            
        if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
        {
            dataGridView.EndEdit();

            Item item = Items[e.RowIndex];
            textBoxLast.Text = item.Selected ? item.Name : string.Empty;
            textBoxAll.Text =
                string.Join(
                    ",",
                    Items.Where(_=>_.Selected).Select(_ => _.Name));
        }
    }
    BindingList<Item> Items = new BindingList<Item>();
}
class Item
{
    public bool Selected { get; set; }
    public string Name { get; set; } = string.Empty;
}

相关问题