【发布时间】:2019-01-29 23:46:00
【问题描述】:
我想在 datagridview c# 中创建一个自动完成单元格。我希望在文本更改时动态填充 autocompletecustomsource。
我已尝试按照中的建议将 textChanged 事件处理程序添加到单元格 “How to get the text from current cell in datagridview textchanged event?”。有用。 但有时它崩溃并显示错误
Vschost32 Error, or memory access violation.
知道如何实现吗?
更新 1
我的代码
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridView dgv = sender as DataGridView;
string headerText = dgv.Columns[dgv.CurrentCell.ColumnIndex].HeaderText.ToString();
DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl;
removeAutoComplete(tb);
if (headerText == "Kode Barang" && tb !=null)
{
tb.TextChanged += new EventHandler(tb_kodeBarang_TextChanged);
}
else if(headerText == "Nama Barang" && tb!=null)
{
tb.TextChanged += new EventHandler(tb_namaBarang_TextChanged);
}
}
private void removeAutoComplete(TextBox tb)
{
tb.TextChanged -= tb_kodeBarang_TextChanged;
tb.TextChanged -= tb_namaBarang_TextChanged;
tb.AutoCompleteMode = AutoCompleteMode.None;
}
private void tb_kodeBarang_TextChanged(object sender,EventArgs e)
{
TextBox tb = sender as TextBox;
if (tb.Text.Length > 0 && tb.Text != "" && tb.Text != null)
{
tb.AutoCompleteMode = AutoCompleteMode.Suggest;
tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
tb.AutoCompleteCustomSource = getStringCollection(tb.Text,"Kode");
}
}
private void tb_namaBarang_TextChanged(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
if (tb.Text.Length > 0 && tb.Text != "" && tb.Text != null)
{
tb.AutoCompleteMode = AutoCompleteMode.Suggest;
tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
tb.AutoCompleteCustomSource = getStringCollection(tb.Text,"Nama");
}
}
【问题讨论】:
-
请显示完整的代码以获取参考和 TextChanged 事件。是否有任何关于控件仍然有效的检查?
-
问题已被编辑。如何检查控件是否仍然有效?
-
我不喜欢您处理初始设置的方式:您总是在显示事件中创建对 tb 的引用。然后清除旧手柄,然后设置新手柄。但是当切换到不同的单元格时,新单元格将有一个新的编辑控件。我相信您应该将 tb 存储为类级变量,检查 null,清除句柄,然后获取新的句柄并设置其句柄。崩溃的重现性如何?
-
感谢先生的建议。所以我在 if (headerText == "Kode Barang" && e.control !=null) 之后移动 tb。那我应该检查什么? tb 还是事件处理程序?如果它是事件处理程序,我怎么知道它是否为空。崩溃发生在插入 1/2 行甚至编辑同一行中的不同列之后。
-
建议编辑对于评论来说太长了,所以我把它写成答案。显然,它未经测试..
标签: c# datagridview