【问题标题】:Changing button text in datagrid c#在datagrid c#中更改按钮文本
【发布时间】:2018-03-20 10:10:45
【问题描述】:

我有一些数据的datagridview,我在这个网格中添加了一个按钮(列),稍后再用它做某事。

//------------------- definitions
DataTable datatable = new DataTable("Points");
this.DATAGRID.DataSource = datatable; //connect data to DATAGRID set in designer

//adding button column
if (DATAGRID.Columns.Contains("Button_column") == false) //I want to add button column only once
{ 
    DataGridViewButtonColumn button_column = new DataGridViewButtonColumn();
    button_column.HeaderText = "ON/OFF";
    button_column.Text = "Click";
    button_column.Name = "Button_column";
    button_column.UseColumnTextForButtonValue = true;
    DATAGRID.Columns.Add(button_column);
}    

//add next columns
datatable.Columns.Add("id", typeof(int));
datatable.Columns.Add("Date", typeof(string));
datatable.Columns.Add("Point", typeof(string));
datatable.Columns.Add("Status", typeof(string));

//set order for the user
DATAGRID.Columns["id"].DisplayIndex = 0; //will need id later
DATAGRID.Columns["id"].Visible = false; //but I hide it from user
DATAGRID.Columns["Date"].DisplayIndex = 1;
DATAGRID.Columns["Point"].DisplayIndex = 2;
DATAGRID.Columns["Status"].DisplayIndex = 3;
DATAGRID.Columns["Button_column"].DisplayIndex = 4;

//------------------- data
int i = 0;
while (r_dane_kontroli.Read())
{

    //I add data here
    datatable.Rows.Add(1, "Date", "Point"); //adding value to the button here won't work (error "to many columns")

    //I TRY TO CHANGE BUTTON TEXT HERE - IN THE LOOP
    //this doesn't work no matter if I adress the row or cell via index or name (tried other indexes too...)
    if(status == "ON")
        DATAGRID.Rows[i].Cells[0].Value = "OFF";
    if(status == "OFF")
        DATAGRID.Rows[i].Cells[0].Value = "ON";

    i++;
}

没有错误。它根本行不通。我不想在这个之后创建额外的循环。

不管我是像上面那样以编程方式添加按钮列,还是通过设计器添加按钮列。效果是一样的。有什么解决办法吗?

【问题讨论】:

  • 运行程序时,按钮是否显示空白文本?或者什么告诉你?
  • 您是直接将名称分配给单元格DATAGRID.Rows[i].Cells[0].Value = "OFF";必须以这种方式分配给按钮:string status = DATAGRID.Rows[e.RowIndex].Cells["Status"].Value.ToString(); if (status.Equals("ON") { button_collumn.Text = "OFF"; } else {button_collumn.Text = "ON"}
  • 程序(运行时)显示我在定义中定义的来自button_collumn.Text = "Click"; 的点击
  • 如果我理解正确,您首先尝试读取状态值(我认为应该是 i 而不是 e),然后以这种方式将按钮分配给文本:button_collumn.Text = "OFF" - 不幸的是我试过了它不起作用,或者我不明白……(错误:button_collumn 在当前(循环)上下文中不存在)

标签: c# winforms button datagridview


【解决方案1】:

您的代码不是很清楚,但我会根据我对您问题的理解尝试给您一个解决方案。

如果您需要为按钮设置不同的文本,可以使用DataGridViewCellFormatting 事件并设置这些单元格的值:

private void DATAGRID_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{ 
    //// If this is a new header row or row, do nothing
    if (e.RowIndex < 0 || e.RowIndex == this.DATAGRID.NewRowIndex)
        return;

    //If your column type button is 0, you must validate this
    if (e.ColumnIndex == 0)
    {
        string status = DATAGRID.Rows[e.RowIndex].Cells["Status"].Value.ToString();

        if (status.Equals("ON"))  
            e.Value = "OFF"; 
        else 
            e.Value = "ON";
    }
}

您必须将此驱动程序分配给CellFormatting 事件:

this.DATAGRID.CellFormatting += DATAGRID_CellFormatting;

【讨论】:

  • 这一行:button_collumn.Text = "OFF";给出错误:当前上下文中不存在名称“button_collumn”。另外请告诉我如何使我的代码更清晰。
  • 您必须将名称button_collumn替换为您的按钮类型列的真实名称
  • 实际上这很好用:if (e.ColumnIndex == 0) {e.Value = "new value" } insead off button_collumn(这是我在项目中使用的真实姓名)-您能否更新您的答案以便我接受? (索引为 0,因为按钮列是代码中添加的第一个)
  • 程序将编译但崩溃并出现此异常错误:Object reference not set to an instance of an object. - 但我确实不需要我可以按上述方式访问文本并且它工作正常。
  • 是的,它工作正常。完整代码:if (e.ColumnIndex == 0) { if (status == "ON") e.Value = "OFF"; else e.Value = "ON"; }。感谢您的帮助。我现在需要回家,所以我现在就接受你的回答,如果你能按照我的方式更新它(它可以让其他人使用它),那就太好了。
猜你喜欢
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多