【问题标题】:How to edit `cell[i]` in data grid view C# win form without button and textbox?如何在没有按钮和文本框的datagridview C#winform中编辑`cell [i]`?
【发布时间】:2021-06-01 18:19:35
【问题描述】:

在 winform 上,我使用编辑器将数据网格视图绑定到 SQL Server 数据库。数据源创建了以下对象:绑定源、表适配器、表适配器管理器和绑定导航器。我的目标只是从 SQL Server 表 [getdata] 中读取信息,允许进行一些编辑,然后将信息传递给数据库表 [newdata];。此外,我在视图中添加了未绑定的列。因此,有“绑定”列和未绑定列。当我运行应用程序时,数据就在那里。但是,我无法编辑任何单元格(未绑定)。网格视图只读属性设置为 false。该列的只读属性设置为 false。

我的 datagridview 代码是:

private void btnCalcSeason3_Click(object sender, EventArgs e)
{

    cnn.Open();
    DataTable dt = new DataTable();
    SqlDataAdapter adapt = new SqlDataAdapter($@"
            SELECT
                Id
                , Tid
                , NAME
                , OfferedAmount
                , BondNum
                , BondValue
                , BondDate
                , BondBank
                , FinancialIndex
                , CASE
                    WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)} THEN 1
                    ELSE 0
                    END AS LCL
                , CASE
                    WHEN FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN 1
                    ELSE 0
                    END AS Ucl
                , CASE
                    WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
                        AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN
                    'داخل'
                    ELSE 'خارج'
                    END AS luresult
                , IsDelete
                , DeleteDisc
                , CASE
                    WHEN FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
                        AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)} THEN 1
                    ELSE 0
                    END AS valresult
                , CASE
                    WHEN
                        FinancialIndex > {Convert.ToDouble(txtLcl.Text)}
                        AND FinancialIndex < {Convert.ToDouble(txtUcl.Text)}
                    THEN 'پذیرش'
                    ELSE 'حذف'
                    END AS sresult
                , CASE
                    WHEN FinancialIndex < {Convert.ToDouble(txtLcl.Text)} THEN 'حذف - فصل سوم - ماده 9 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
                    WHEN FinancialIndex > {Convert.ToDouble(txtUcl.Text)} THEN 'حذف - فصل سوم - ماده 10 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
                    WHEN 
                        FinancialIndex < {Convert.ToDouble(txtLcl.Text)}
                        AND FinancialIndex > {Convert.ToDouble(txtUcl.Text)}
                    THEN 'حذف - فصل سوم - ماده 9و10 - فاقد صحت مبانی قیمت و غیرقابل اجرا'
                    ELSE ''
                END  AS decription
        FROM Bidder
        WHERE tid = {frmDomain.ID}", cnn);
    adapt.Fill(dt);
    dgSeason3.DataSource = dt;
    dt.Columns.Add("chbCommittee", typeof(bool), "valresult");
    dt.Columns.Add("result", typeof(string), "sresult");
    dt.Columns.Add("discreason", typeof(string), "decription");
    cnn.Close();
    dgSeason3.Columns["Id"].Visible = false;
    dgSeason3.Columns["Tid"].Visible = false;
    dgSeason3.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
    dgSeason3.Columns["Name"].HeaderText = "نام شرکت ";
    dgSeason3.Columns["OfferedAmount"].Width = 135;
    dgSeason3.Columns["OfferedAmount"].HeaderText = "مبلغ پیشنهادی";
    dgSeason3.Columns["FinancialIndex"].Width = 110;
    dgSeason3.Columns["FinancialIndex"].HeaderText = "شاخص مالی ";
    dgSeason3.Columns["Lcl"].Width = 120;
    dgSeason3.Columns["Lcl"].HeaderText = "بررسی حد پایین ";
    dgSeason3.Columns["Ucl"].Width = 120;
    dgSeason3.Columns["Ucl"].HeaderText = "بررسی حد بالا";
    dgSeason3.Columns["luresult"].Width = 120;
    dgSeason3.Columns["luresult"].HeaderText = "بررسی محدوده";
    dgSeason3.Columns["chbCommittee"].Width = 120;
    dgSeason3.Columns["chbCommittee"].HeaderText = "نظر کمیته فنی";
    dgSeason3.Columns["result"].Width = 120;
    dgSeason3.Columns["result"].HeaderText = "وضعیت";
    dgSeason3.Columns["discreason"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dgSeason3.Columns["discreason"].HeaderText = "توضیحات";
    dgSeason3.Columns["IsDelete"].Visible = false;
    dgSeason3.Columns["DeleteDisc"].Visible = false;
    dgSeason3.Columns["BondNum"].Visible = false;
    dgSeason3.Columns["BondValue"].Visible = false;
    dgSeason3.Columns["BondDate"].Visible = false;
    dgSeason3.Columns["BondBank"].Visible = false;
    dgSeason3.Columns["valresult"].Visible = false;
    dgSeason3.Columns["sresult"].Visible = false;
    dgSeason3.Columns["decription"].Visible = false;
    dgSeason3.Columns["OfferedAmount"].DefaultCellStyle.Format = ("#,0");
    dgSeason3.Columns["BondValue"].DefaultCellStyle.Format = ("#,0");
    dgSeason3.ReadOnly = false;
}

【问题讨论】:

  • 你的代码容易被SQL注入。我建议你改用AddWithValue
  • @GeomanYabes - 从不使用 AddWithValue: 1, 2, 3
  • 谢谢@AlexanderPetrov。这是一些有趣的文章。

标签: c# winforms datagridview


【解决方案1】:

您将错误的列名绑定到网格列。

你正在使用DataTable.Columns.Add(string? columnName, Type type, string expression)重载:

dt.Columns.Add("chbCommittee", typeof(bool), "valresult");
dt.Columns.Add("result", typeof(string), "sresult");
dt.Columns.Add("discreason", typeof(string), "decription");

列名应该是"chbCommittee""result""discreason",但您一直在网格中使用"Expression"

dgSeason3.Columns["valresult"].Visible = false;
dgSeason3.Columns["sresult"].Visible = false;
dgSeason3.Columns["decription"].Visible = false;

修复:

dgSeason3.Columns["chbCommittee"].Visible = false;
dgSeason3.Columns["result"].Visible = false;
dgSeason3.Columns["discreason"].Visible = false;

补充:

正如评论中提到的,您的代码很容易出现SQL Injection。您应该改用AddWithValue(或SqlParameterCollection.Add method,因为@AlexanderPetrov 在他的评论中指出AddWithValue 存在问题。):

如果您有一个模型列表,然后将 List&lt;BidderModels&gt; 绑定到您的 dgSeason3.DataSource,您的代码也会更简洁:

public class BidderModel {
    public string Id { get; set; } //change `string` into whatever data type your `Id` column is
    public string Tid { get; set; } //change `string` into whatever data type your `Tid` column is
    // . . . . your "bound" columns
   // . . . . your "unbound" columns

}

那么你可以像下面这样使用上面的模型:

private void btnCalcSeason3_Click(object sender, EventArgs e)
{

    cnn.Open();
    DataTable dt = new DataTable();
    SqlDataAdapter adapt = new SqlDataAdapter($@"your query", cnn);
    adapt.Fill(dt);

    cnn.Close();

    List<BidderModel> bidders = new List<BidderModel>();
    foreach(DataRow dr in dt.Rows)  // dt is a DataTable
    {
        bidders.Add(new BidderModel() {
            Id = int.Parse(dr["Id"].ToString()),
            Name = dr["Name"].ToString(),
            // . . . and so on and so forth
        });
    }

    dgSeason3.DataSource = bidders;
    
}

【讨论】:

  • 谢谢,我将代码更改为公共类 BidderModel... 但我仍然无法编辑 currentrow.columns[5] 我需要编辑此列并在编辑后自动更改另一列值
  • @abbas,你是什么意思 "edit currentrow.columns[5]"?你在哪里编辑?
  • 非常感谢这段代码的工作,但是当我想编辑列 [5] 的一个单元格时,我必须将所有网格视图更改为只读 false,但我只想更改列 [5] 的只读] 为假
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
相关资源
最近更新 更多