如何在没有按钮和文本框的数据网格视图 C# win 表单中编辑 `cell[i]`?

时间:2021-06-01 18:19:35

标签: c# winforms datagridview

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

1 个答案:

答案 0 :(得分:0)

您将不正确的列名绑定到网格列。

您正在使用 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,因为 AddWithValue 有问题,如@AlexanderPetrov 在他的评论中所述。):

如果您有一个模型列表,然后将该 List<BidderModels> 绑定到您的 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;
    
}
相关问题